标签:指针 接下来 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的同时还能最终造成任意地址写。
标签:指针 接下来 chunk malloc safe 红色 今天 指针成员 索引
原文地址:http://www.cnblogs.com/rec0rd/p/7900953.html