house of enherjar:让top chunk合并到任意位置
Heap基础知识
[toc]
house of enherjar
一句话描述该漏洞:在任意地方伪造一个fake_chunk,然后通过控制紧邻top chunk的chunk的prev_size和prev_inuse位,导致当该chunk被释放时会根据prev_size直接合并到fake_chunk,而由于该chunk本身和top chunk相连,那么该fake chunk又会与top chunk合并,导致top chunk的指针从fake chunk开始,这样一来从top chunk申请内存时将申请到fake chunk处的内存。如图所示(该图来自于hollk大佬的博客):

该技术用了两个地方的漏洞:
- 若紧挨着
top chunk的chunk被free,那么该chunk会与top chunk合并。 - 当前
chunk被free时,会通过当前chunk的prev_inuse位来判断前一个chunk是否也是free状态,若是,那么会进行合并。(像fastbin这种不会合并的不包括在内) - 合并过程是先后向合并(与前面的
chunk合并),再前向合并(与后面的chunk合并,比如top chunk)
你需要控制才能完成攻击的:
- 控制紧邻
top chunk的chunk的prev_inuse位,以及该chunk的prev_size。(通常是使用off by one) - 在某处(通常是位于栈上)能够伪造一个
fake chunk。
笔者本人写了一段house of enherjar的代码,如下所示:
1 | |
house of enherjar:让top chunk合并到任意位置
http://example.com/2023/09/23/system/Heap/house_of_enherjar/