逆向题(21):nss:407

nss:407

这是一个关于算法的题,

random.seed(1)

这句代码的意思是一个种子,使每次生成的随机数序列一样。

l.append() 是 Python 中 列表(list) 的一个方法,用来将一个元素添加到列表的末尾。l.append() 是 Python 中 列表(list) 的一个方法,用来将一个元素添加到列表的末尾。

random.getrandbits(k) 会返回一个具有 k 位的随机整数。这意味着生成的整数是一个介于 02^k - 1 之间的整数。例如,调用 random.getrandbits(8) 将返回一个介于 0 和 255 之间的随机整数,因为 8 位的二进制数可以表示的最大值是 2^8 - 1 = 255

关于我下面这个l怎么得到的可以看第二张图片

result.append(ord(flag[i*5+n])^random.getrandbits(8))

根据这个我们知道,result是通过flag与random这个固定种子生成异或得到的。那我们如果逆推过来求flag,我们肯定需要知道这个random,这也就是我上面两张图的解释。便于理解。

random.getrandbits(8)我们先把这个求出来吧。

注意:这里我突然想到n为什么是5,忘记说了,我们在第一个题目中可以看见,我们的flag是20个字符,我也标清楚了。然后在下面这个嵌套循环中,外层循环i是4(l的长度是4),然后内层中i×5+n其中i×5才能是20。才可以得到我们的flag的长度,完全理由我们每个flag字符。

result.append(ord(flag[i*5+n])^random.getrandbits(8))
# 在上面这个里面我在说一下flag每次是以每5个一组去进行的。

[78, 83, 83, 67, 84, 70, 123, 70, 97, 107, 101, 69, 95, 114, 97, 110, 100, 111, 109, 125]

我们要把这个转换成字符串,在python中我不会,我专门查了一下,可以用这个函数

flag = ''.join(chr(i) for i in flag)

大家应该不陌生这个.join但是会对后面着循环陌生,我也一样然后我们转换一下吧

NSSCTF{FakeE_random}

解出答案

关于这道题,我是终于靠着自己一步步分析做出来了,可能对别人来说很简单的一道题,但是之前做的题,我第一次接触肯定不太会,也是会在网上查相关的解题方法,但随着一步步进步,我也可以慢慢分析,并且做出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值