前言
NSS上的[SWPUCTF 2021 新生赛]fakerandom
知识点
python
随机数
题目
下载题目附件得到python源码
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(8)
返回一个数字
然后与flag
中的某位数进行异或
思路
知识补充
python random()模块
seed()函数
改变随机数生成器的种子
先调用它的情况下,使用 random() 生成的随机数将会是同一个
getrandbits(k)
返回具有 k 个随机比特位的非负 Python 整数
1个数字占8个字节
python append()方法
在列表末尾添加新的对象
list1 = ['Google', 'Runoob', 'Taobao']
list1.append('Baidu')
print ("更新后的列表 : ", list1)
>>>更新后的列表 :['Google', 'Runoob', 'Taobao', 'Baidu']
类似于+=
(?
操作
因为seed
随机数种子已经被指定,所以随机数处理那部分直接copy即可
然后修改最底下的异或语句即可
编写python脚本如下
import random
result = [201, 8, 198, 68, 131, 152, 186, 136, 13, 130, 190, 112, 251, 93, 212, 1, 31, 214, 116, 244]
random.seed(1)
l = []
for i in range(4):
l.append(random.getrandbits(8))
flag=''
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)
>>>NSSCTF{FakeE_random}
总结
一次对随机数的逆向,本质还是异或