NSSCTF_Re_[SWPUCTF 2021 新生赛]fakerandom
坚持第二天
源代码:
import random flag = 'xxxxxxxxxxxxxxxxxxxx' random.seed(1) l = [] for i in range(4): l.append(random.getrandbits(8)) result=[] for i in range(len(l)): random.seed(l[i]) for n in range(5): result.append(ord(flag[i*5+n])^random.getrandbits(8)) print(result) # result = [201, 8, 198, 68, 131, 152, 186, 136, 13, 130, 190, 112, 251, 93, 212, 1, 31, 214, 116, 244]
getrandbits函数
讲解:(10条消息) python random扩展随机数函数getrandbits(k)的使用_爆肝程序猿的博客-CSDN博客_getrandbits函数的用法
python中random.getrandbits(k)函数输出的是一个0~2^k-1范围内的一个随机整数,k表示的是2进制的位数
所以可以得知l列表里加入了四个0~255范围内的随机整数
接着
对于random.seed函数
讲解:Python之random.seed()用法 - 简书 (jianshu.com)
所以这个random随机数其实是固定的
然后就开始实验:
注意:这里的flag必须是20位否则会报错
自己改改flag再输出看看,这里因为知道随机数是固定的,所以把 l 列表输出看看
import random flag = 'NSSCTFNSSCTFNSSCTFNS' random.seed(1) l = [] for i in range(4): l.append(random.getrandbits(8)) result=[] print(l) for i in range(len(l)): random.seed(l[i]) for n in range(5): result.append(ord(flag[i*5+n])^random.getrandbits(8)) print(result)
得到:
[34, 145, 216, 205]
[201, 8, 198, 68, 131, 152, 143, 157, 63, 170, 143, 115, 234, 124, 230, 44, 47, 255, 87, 218]
那么现在知道了l列表,
接下来,因为
random.seed(l[i])
这句话会改变种子,所以我们也就知道了他会怎么改变,
插一句print看看
发现种子更改之后得到的随机数任然是固定的
那这就好办了,众所周知异或可以直接抄代码
所以把源代码改改就可以出了
脚本:
import random random.seed(1) flag='' result=[201, 8, 198, 68, 131, 152, 186, 136, 13, 130, 190, 112, 251, 93, 212, 1, 31, 214, 116, 244] l=[34, 145, 216, 205] for i in range(len(l)): random.seed(l[i]) for n in range(5): flag+=chr(result[i*5+n]^random.getrandbits(8)) print(flag)
flag:
NSSCTF{FakeE_random}