Chunk Overlaping



chunk overlap 堆块重叠,是一种用于漏洞利用的堆排布技术,无论是能够造成8~16字节以上的大范围溢出,还是仅溢出一个字节的off-by-one,都有可能造成chunk overlap,灵活运用堆排布构造chunk overlaping 能够得到很powerful的漏洞利用效果。

原理

chunk overlap 堆块重叠,其目的是通过修改chunk->size使得heap部分的chunk重叠出现混乱,从中作梗。
之所以会出现chunk overlaping,是由于ptmalloc中对chunk的识别使用的边界标记法,是通过size,prev_size来上下计算确定chunk边界
而无论是size还是prev_size都容易oveflow,size的修改会造成堆空间的分配与释放混乱
一个chunk的基本结构如下:

以64bit为例,如果我们能够heap overflow 9个字节,则必然可以覆盖到size字段
即便只能够覆盖一个字节,在prev-size被使用的情况下也能够覆盖Size一个字节

可见在heap overflow 时,通过malloc就会覆盖到size,并且溢出的那个byte正好能够overflow修改掉next chunk的Prev_inuse bit标志位
这样再通过malloc与free就能够构造chunk 的重叠,形成下图所示的效果:

overlapping 后的heap块由于重叠,可在此基础上继续实现漏洞利用。

How2Heap

在论文中一共提到了三种利用手段
以shellfish how2heap chunk overlap为示例,其中去掉了多余的注释,为了增加可读性

expand freed chunk

可根据上图直观理解Overlapping造成的原因
Freed p2 chunk的Size被溢出修改为0x181,这里只使用了一个off-by-one,并且此时Freed p2在Unsotred bin中,所以下次再次malloc(0x180-0x8)查找unsorted bin即可分配到P2
无辜的P3就这样被P4 overlapping掉了
程序运行结果如下:

expand allocted chunk

该技巧与expand freed chunk 非常相似,只不过提前overflow,在free,与expand freed chunk 没有本质区别。

shrink freed chunk

目前在glibc-2.23(ubuntu 16.04)的版本,shrink freed chunk已经不能使用了
主要是libc在unlink宏中打上了如下的Patch,想要Bypass可参考Positon Null byte:

在如下的源代码中,当

shrink freed chunk的过程可大致描述如下:

我们可以根据上图直观理解,也可以借鉴positon null byte 的思想,两者基本一致。

总结

overlap 的情況其实还是蛮 powerful 的,如果中间 overlap 部分有 function pointer 或者是其他有⽤的 struct 可以直接劫持控制流。
构造overlap的情形主要应用在size被覆盖的情况下,根据malloc的边界标记法,从而造成chunk 在malloc或free时确定大小失误。

参考资料

Glibc_Adventures-The_Forgotten_Chunks
Advanced heap exploitation Angelboy

发表评论