[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]
这里出现了random.seed()和random.getrandbits(),下面我们一一讲解
random.getrandbits(k)
参考:https://blog.csdn.net/weixin_42675552/article/details/114314553
python中random.getrandbits(k)函数输出的是一个0~2^k-1范围内的一个随机整数,k表示的是2进制的位数
因此这里for循环的random.getrandbits(8)是四个范围为0~2^8-1=255的随机整数,即l列表加入了四个范围为0 ~ 255的随机整数
输出l列表,以查看l列表值

[34, 145, 216, 205]
random.seed()
参考:https://www.jianshu.com/p/551a95290645
当seed()没有参数时,每次生成的随机数是不一样的,而当seed()有参数时,每次生成的随机数是一样的,同时选择不同的参数生成的随机数也不一样
而random.seed(l[i])
这段代码会改变种子,为了确认种子改变,random.getrandbits(k)是否会改变,于是在种子改变后,写一个输出函数确认

发现随机数没变,即l列表的值没变
仍然为[34, 145, 216, 205]
众所周知异或可以直接抄代码
所以把源代码改改就可以出了
脚本

点击查看代码
import random
flag = ''
l = [34, 145, 216, 205]
result = [201, 8, 198, 68, 131, 152, 186, 136, 13, 130, 190, 112, 251, 93, 212, 1, 31, 214, 116, 244]
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}

浙公网安备 33010602011771号