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}

posted @ 2022-04-12 20:36  Luccky  阅读(284)  评论(0编辑  收藏  举报