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的同时还能最终造成任意地址写。

 

转载于:https://www.cnblogs.com/rec0rd/p/7900953.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值