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/