House of XXX的核心原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了House of XXX的核心原理相关的知识,希望对你有一定的参考价值。

最近接触了堆溢出的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的核心原理的主要内容,如果未能解决你的问题,请参考以下文章

Week of 2.28

Week of 2.21

House of Force

Spring Boot核心原理

Week of 3.14

使用 GCD 时核心数据实体出错