「TSCTF-J_2021」Pwn - Random WriteUp
· 阅读需 5 分钟
分析
使用 IDA 打开, 发现题目要求我们输入正确 10 次 C 产生的随机数, 接着需要再输入正确的/dev/urandom
产生的随机字节数据流
初期资料
rand()
rand()
函数每次调用前都会查询是否调用过srand(seed)
,是否给seed
设定了一个值,如果有那么它会自动调用srand(seed)
一次来初始化它的起始值
若之前没有调用srand(seed)
,那么系统会自动给seed
赋初始值,即srand(1)
自动调用它一次
/dev/urandom
/dev/urandom
是 Linux 系统中提供的随机伪设备,任务是提供永不为空的随机字节数据流。
既然rand()
是根据随机数种子seed
生成随机数,那么只要seed
相同,不就可以生成一样的随机数了么?
分析代码
第一个随机
我们可以发现buf的长度是22, 却可以读入0x30bytes的数据
观察栈堆,可以发现buf与seed只相距0x18个字节, 则我们可以考虑栈溢出覆盖随机数种子