目录

  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 Reverse 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}

总结

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