网安知识
Linux heap 学习 (下)
2018-09-19 10:08

本文为原创文章,转载请注明出处!



之前我们学习了Linux heap 学习 上,今天的文章继续第二部分的内容

title: Linux heap 学习 

tags: Heap,pwn,linux

grammar_cjkRuby: true

利用周末的时间,系统的学习了linux 系统的glibc堆分配机制,从中了解了很多以前很模糊的东西。本文打算系统的讲解一下关于堆的分配和使用机制,同时思考可能存在的一些攻击方法。


0x03 Heap 漏洞利用方法


Fast bin 类型

0x1 Double free

在fastbin中存在的一种漏洞利用方式,fastbin在free堆块时会检查是否重复释放同一个堆块。如果我们绕过了安全机制将一个堆块释放了两次,那么就可以通过malloc的堆块对fastbin链表中的堆块的fd进行改写,从而可以实现申请任意内存的目的。下面是具体的利用方法:

QQ截图20180919103135.jpg

微信图片_20180919103238.png

微信图片_20180919103304.png

利用方法比较简单,绕过检查机制,两次申请内存,重写fastbin堆块的链表,造成任意内存地址申请。


0x2 Fastbin cover fd

通过前一个fastbin覆盖后面的fastbin的fd使得下下次分配的时候可以得到任意地址(这里测试的是bss段

具体操作方法如下

QQ截图20180919103606.jpg

微信图片_20180919103652.jpg

通过溢出前一块,覆盖下一块fd指针。关键在于bypass malloc fastbin安全检测,看大小是否是fastbin的范围


0x3 House of Spirit

看到fastbin的链表结构是不是又想到一种,如果free一个假的堆块指针,那么他也会插进fastbin链表,这时再次申请相同内存空间(注意大小),就可以对我们伪造的一段内存进行操作。 下面是具体的利用方法。

QQ截图20180919103808.jpg

微信图片_20180919103826.png


主要还是在free的时候检查的不够仔细,造成伪造chunk插入fastbin的现象。

Small bin 类型

0x1 House of Einherjar

此漏洞的根本原因在于在执行free函数是,检测previnuse位后符合合并条件就开始合并,虽然在unlink时有是否在链表的检测,但是没有对prevsize的大小进行检测。 具体利用过程如下

QQ截图20180919104009.jpg

微信图片_20180919104025.jpg

对于堆块合并检查的不够到位,有漏洞可寻。


0x2 House of lore

通过伪造smallbin链表,欺骗smallbin将伪造链表加入主链表。从而获得目标地址的读写权。 具体操作如下

QQ截图20180919104313.jpg

QQ截图20180919104350.jpg

微信图片_20180919104409.jpg

主要是可以对free掉的指针进行操作,从而使得链表的构成。同时绕过了smallbin 的malloc检测,成功实现了分配栈地址,最后覆盖了ret地址


0x3 poison null byte

此类型的漏洞比较新奇,主要利用的堆块在向前合并时并没有检查前一块堆块的大小,导致了合并现象的发生,从而可以操作已经malloc的内存区域。

申请三个连续的内存a,b,c

释放b,并且将末尾块的前8byte设置成虚假的prevsize,用来保护c块中真实的prevsize

用a的0 byte 溢出覆盖b堆块的size位,使得大小变小,且正好在prev_size的上面

连续申请b1,b2,注意总大小不要超过b,这样使得c的P位始终保持为0,为的是后面的free(c)合并操作,这时因为有2中的fake prev_size的保护所以一直没有变,最后free(c),检测b1是否在freebin的链表中

QQ截图20180919104640.jpg

微信图片_20180919104655.jpg


重点还是在于那个fake prev_size,一个很奇特的用法


0x4 overlapping chunks after free

首先创建两个smallbin,然后正常free掉一个smallbin ,然后更改free掉的chunk的size,使之包含下一个chunk,再次malloc即可对下一chunk进行操作

QQ截图20180919104837.jpg


0x5 overlapping chunks before free

上一个是在free之后更改大小,这一次是在free之前更改大小

QQ截图20180919104949.jpg

QQ截图20180919105025.jpg

起因还是可以随意更改chunk的size


unsorted bin 类型

0x1 unsorted bin attack

通过对unsorted 堆块指针的篡改,使得在unsorted bin链表中拆掉时,造成任意地址写漏洞。 并且只是单向链表的赋值 p->bk->fp=p->fp

QQ截图20180919105207.jpg

微信图片_20180919105224.jpg

这里有个疑问在unsortedbin 的chunk拆下来时,其fd中的地址内容并没有改变,推测只改变了bk指针内的内容。


0x2 unsafe unlink


在空闲堆块合并的时候执行unlink函数,通过伪造fd和bk指针达到修改任意地址的目的。注意unlink的安全检测,具体操作如下

申请两个连续的chunk

在第一个chunk中伪造一个fake chunk

将bss的指针参数地址填写到fake chunk的fd,bk,并且能够绕过检测unlink

free(chunk2) 发生合并,并执行unlink,将free chunk从链表中卸掉

QQ截图20180919105413.jpg

微信图片_20180919105430.jpg

这种利用方法只需绕过unlink的链表检测,操作比较简单


Top chunk 类型

0x1 House of Force

这个类型的漏洞利用方法比较简单,通过溢出更改topchunk的大小(这里改成-1),从而可以malloc到想要的内存地址 具体利用流程如下

QQ截图20180919105608.jpg

微信图片_20180919105627.png

这里BSS段在heap的前面所以说相当于malloc函数向前申请了空间,这一点不知道是如何做到的,并且这里缺少安全机制的检测


0x2 The house of orange

这个漏洞的利用过程很是奇妙,主要利用了在执行abort的时候调用了 _IO_flush_all_lockp函数,这里需要了解 IO_FILE_ALL的结构,

微信图片_20180919105728.jpg

所以这个漏洞的根本原因在于,重写了存储 IO_FILE_ALL的指针,通过触发malloc函数中的unlink操作使得检测失败,执行难abort函数,然而其中的 _IO_flush_all_lockp函数早已被替换为其他的地址,成功劫持执行流。

几个步骤

申请两个大于fastbin大小的堆块,并且把第一个chunk释放掉(主要是为了获得fp,bk指针)

伪造iofile,通过unsorted attack去更改iofile指针中的内容

更改被free chunk的大小(将该chunk存放在特定的smallbin中)

执行malloc 申请内存大小不同于上述的chunk,通过unsorted的遍历触发malloc abort函数

QQ截图20180919105832.jpg

微信图片_20180919105847.png

注意几个要点

程序流劫持是abort中的函数造成的,具体的操作是替换了IO_FILE的指针

替换指针的操作是unsorted bin从链表中拆除造成的

修改堆块的大小是为了将chunk插入相对应偏移的smallbin list中

malloc异常是由unsorted bin指针异常引起的



文章仅用于普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征等,若读者因此做出危害网络安全的行为后果自负,与合天智汇以及原作者无关,特此声明。





































上一篇:Linux heap 学习 上
下一篇:docker简单实用教程
版权所有 合天智汇信息技术有限公司 2013-2021 湘ICP备14001562号-6
Copyright © 2013-2020 Heetian Corporation, All rights reserved
4006-123-731