目录

  1. 1. 前言
  2. 2. 知识点
  3. 3. 题目
  4. 4. 思路
    1. 4.1. 知识补充
      1. 4.1.1. python random()模块
      2. 4.1.2. python append()方法
    2. 4.2. 操作
  5. 5. 总结
↑

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

RE初探索0x08

2023/4/11 Rev python
  |     |   总文章阅读量:次

前言

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}

总结

一次对随机数的逆向,本质还是异或