[SWPUCTF 2021 新生赛]fakerandom

看题目

image

代码

image

点击查看代码
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列表值
image

[34, 145, 216, 205]

random.seed()

参考:https://www.jianshu.com/p/551a95290645

当seed()没有参数时,每次生成的随机数是不一样的,而当seed()有参数时,每次生成的随机数是一样的,同时选择不同的参数生成的随机数也不一样

而random.seed(l[i])
这段代码会改变种子,为了确认种子改变,random.getrandbits(k)是否会改变,于是在种子改变后,写一个输出函数确认

image

发现随机数没变,即l列表的值没变

仍然为[34, 145, 216, 205]

众所周知异或可以直接抄代码

所以把源代码改改就可以出了

脚本

image

点击查看代码
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}

参考:https://www.cnblogs.com/1ucky/p/16137123.html

posted @ 2022-11-13 17:48  Zer0o  阅读(215)  评论(1)    收藏  举报