0%

伪随机数绕过

随机数生成原理

rand()

C 库函数 int rand(void) 返回一个范围在 0 到 RAND_MAX 之间的伪随机数。

RAND_MAX 是一个常量,它的默认值在不同的实现中会有所不同,但是值至少是 32767。

srand()

C 库函数 void srand(unsigned int seed) 播种由函数 rand 使用的随机数发生器。

void srand(unsigned int seed)

参数seed是一个整形值,用于伪随机数生成算法播种。

伪随机数绕过方法

修改seed

有时随机数的种子seed会在栈上,可以通过栈溢出等方法对齐进行覆盖为已知值,再通过这个已知值获取对应的随机数序列

利用ctypes撞库

ctypes是Python内建的用于调用动态链接库函数的功能模块,通过调用该模块以及利用与题目相同的libc文件,来达到一个与题目中随机数生成方式相同的效果,实现撞库,这种方式下如果提前覆盖了指定种子,是更容易达成,如果直接设置时间种子撞库,可能存在时间对不上的情况,需要多测试几次。

使用方法:

1
2
3
4
5
from ctype import *
libc=cdll.LoadLibrary("libc.so.6")
a=[]
for i in range(50):
a.append(libc.rand())
1
2
3
#使用相同时间为种子
elf1=ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6")
elf1.srand(elf1.time(0))