-
-
[原创]堆的六种利用手法
-
发表于:
2018-9-11 23:36
25698
-
忙恶心的工程实训,还耽误校招,只能说学校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开头
脚本:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-1-28 14:30
被admin编辑
,原因: