nss:407
这是一个关于算法的题,
random.seed(1)
这句代码的意思是一个种子,使每次生成的随机数序列一样。
l.append()
是 Python 中 列表(list) 的一个方法,用来将一个元素添加到列表的末尾。l.append()
是 Python 中 列表(list) 的一个方法,用来将一个元素添加到列表的末尾。
random.getrandbits(k)
会返回一个具有 k
位的随机整数。这意味着生成的整数是一个介于 0
和 2^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}
解出答案
关于这道题,我是终于靠着自己一步步分析做出来了,可能对别人来说很简单的一道题,但是之前做的题,我第一次接触肯定不太会,也是会在网上查相关的解题方法,但随着一步步进步,我也可以慢慢分析,并且做出来