堆溢出原理

相比栈溢出而言,堆溢出的原理类似,但是堆溢出的利用则更复杂,因为glibc堆管理机制比较复杂。

堆溢出的利用主要围绕在binfree chunk的合并过程,在两个free chunk的合并过程中,有两次改写地址的机会。例如,对于将要合并的chunk P,在合并发生时,glibcchunk Pbinlistunlink掉,其中涉及到以下指针操作:

1
2
3
4
FD = P -> fd;  // FD为相对于P下一个chunk的地址
BK = P -> bk; // BK为相对于P上一个chunk的地址
FD -> bk = BK; //用上一个chunk的地址去改写下一个chunk的前向指针bk,即改写FD+12(32 bits)或FD+24(64 bits)地址中的内容
BK -> fd = FD; //用下一个chunk的地址去改写上一个chunk的后向指针fd,即改写BK+8(32 bits)或BK+16(64 bits)地址中的内容
阅读全文 »