首页
社区
课程
招聘
[原创]堆的六种利用手法
发表于: 2018-9-11 23:36 25696

[原创]堆的六种利用手法

2018-9-11 23:36
25696

忙恶心的工程实训,还耽误校招,只能说学校zz。
上次参加网鼎杯线下赛因为利用手法单一,libc版本太老无法本地调试且,one_gadget失效被打爆。
痛定思痛,回顾学习以下堆利用能够使用的常见方法。使用程序为0ctf2017的babyheap程序,libc为2.24版本。


程序开启了全保护。


完整菜单,有alloc,fill,show,free功能。

alloc功能,可以申请16个大小不大于4096字节的堆块。
使用calloc分配。

fill功能,存在明显漏洞点,可进行任意字节的输入。堆溢出

free功能,free指定索引堆,并清除悬挂指针无漏洞。

show功能,使用write函数输出,不用考虑0字节截断问题。

堆漏洞利用的原因大部分都出在能够对free后的堆块进行写入,程序存在明显的堆溢出漏洞。堆溢出可以造成很多的问题,此题可以直接溢出向之后free状态的堆块进行写入会带来无穷无尽的安全问题。
通过堆溢出我们可以实现多种多样的利用手法。

程序使用calloc进行堆的分配。calloc同malloc类似只是会将申请到的堆块内容清0。所以常规的unsorted bin信息泄露的方式不可行。需要使用堆溢出进行配合
程序使用calloc进行堆的分配,



之后free堆块2,再申请一个0x60大小的堆块就可以通过show堆块3来泄露出libc的地址


最常见也是最容易的一种堆利用方法。
malloc函数会首先检查malloc_hook的值,若不为0则会调用他。若我们能通过内存写入malloc_hook即可实现任意地址跳转
通过fastbin_attack攻击malloc_hook。首先观察malloc_hook上方数据

fastbin在分配时并不检查对齐情况,将fastbin的fd设置为__malloc_hook-0x23,触发fastbin attack分配得到malloc_hook上方内存空间,向malloc_hook进行写入one_gadget得到权限。
脚本:

一种很巧妙的利用方法。有些情况下one_gadget因为环境原因全部都不可用,这时可以通过realloc_hook来调整堆栈环境使one_gadget可用。
realloc函数在函数起始会检查realloc_hook的值是否为0,不为0则跳转至realloc_hook指向地址。
realloc_hook同malloc_hook相邻,故可通过fastbin attack一同修改两个值。
观察一下realloc_hook值不为0时realloc函数过程。


流程为push寄存器,最后全部pop出来跳转至realloc_hook的值。
将realloc_hook设置为选择好的one_gadget,将malloc_hook设置为realloc函数开头某一push寄存器处。push和pop的次数是一致的,若push次数减少则会压低堆栈,改变栈环境。这时one_gadget就会可以使用。具体要压低栈多少要根据环境决定,这里我们可以进行小于48字节内或72字节的堆栈调整。

脚本:开始的函数一致。不再重复

同malloc_hook类似,在调用free函数时会先检验free_hook的值。
但是free_hook上方都是0字节。不能直接通过fastbin_attack进行攻击,可以通过修改top
free_hook上方,之后申请内存至free_hook修改为system地址。
fastbin数组在top chunk指针上方。可以通过free fastbin chunk修改fastbin数组的值使的fastbin attack可以实现。 存在限制要求堆的地址以0x56开头

脚本:


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-1-28 14:30 被admin编辑 ,原因:
上传的附件:
收藏
免费 9
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  junkboy   +1.00 2018/09/15
最新回复 (2)
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
图片丢失了,能否重传一下?
2018-9-21 21:03
0
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
很棒,对我帮助很大,以前就是用malloc_hook并不知道free_hook的利用方法
2020-2-14 18:04
0
游客
登录 | 注册 方可回帖
返回
//