码迷,mamicode.com
首页 > 其他好文 > 详细

House of XXX的核心原理

时间:2017-11-26 23:58:43      阅读:458      评论:0      收藏:0      [点我收藏+]

标签:指针   接下来   chunk   malloc   safe   红色   今天   指针成员   索引   

最近接触了堆溢出的pwn,对网上解释绕过safe unlink的方法(各种House of XXX)的解释感觉不够简洁精要,故作此总结记录。关键点可以只看红色加粗部分。

 

首先,堆溢出最好的利用方法是能覆盖关键变量,例如函数指针,但这样的场景可遇不可求。

 

堆溢出的unlink利用方法是通用的利用方法,但是在linux加入了safe unlink检查之后,这种利用方法基本失效。但是后来有人发现在各种苛刻的条件下有可能绕过safe unlink且能利用成功,这就是我们今天说的House of XXX。

 

从字面猜测,House其实想表达的意思是“家”的意思,在实际意义上是指一个指针数组(指针们温馨的家),而这个数组里的指针都是指向malloc分配的内存的,而且大小相差不大且可以由用户连续分配(glibc会优先保证这种情况下得到的堆是连续的)。

 

接下来,如果这些malloc的堆有存在堆溢出的话,就可以改写这个家庭成员里的下一个堆的头部,实现fake chunk的构造,顺便在这个fake chunk前面构造一个fake free chunk,这样当fake chunk被free的时候,glibc发现Prev is free,并且根据PrevSize定位到前面的fake free chunk,并根据其中的fd和bk进行unlink。

 

到目前为止,House的真正作用还没有完全发挥出来,接下来是House的最重要作用:绕过safe unlink且能造成任意地址读写。

 

House是如何做到的呢?根据safe unlink的检查代码及堆头的结构,我们发现只要我们的fake free chunk中的fd和bk分别写入一个指向该chunk头部的指针的地址减0x18和0x10(64位下)就可以绕过safe unlink。

 

这个比较好解释,但是这样做是如何最终导致任意地址写的呢?

 

这样做了之后,unlink之后会让这个House里的某一个指针不再指向其原本malloc的堆得地址,而是指向这个温馨的家里的一个其他成员(House of XXX)。

 

到这一步之后,我们可以通过House索引到第一个指针对其指向的内存进行写操作(正常的memcpy即可),但其实已经变成写这个家庭成员的其他成员值了--改写一个指针的值位任意值。

 

接下来,我们在通过这个House来索引到那个被改了值得指针成员(已经被改了值),再对他指向的内存进行写操作,这就是像任意的内存地址写任意值了。

 

这就是House的真正作用,在绕过safe unlink的同时还能最终造成任意地址写。

 

House of XXX的核心原理

标签:指针   接下来   chunk   malloc   safe   红色   今天   指针成员   索引   

原文地址:http://www.cnblogs.com/rec0rd/p/7900953.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!