一 small bin,large bin等的内存结构
未分配的chunk
| pre chunk size | size |F|C|P|
| fd | bk |
presize: 前一个块的大小(如果前一个块是空闲的)
size:当前块的大小
F标志位:目前还没有用
C标志位:如果当前块已被分配,置1;否则,置0
P标志位:如果前一个块已被分配,置1,;否则,置0
二、unlink
久经辛苦终于看明白了。还是很精妙的。
unlink是free非fastbin时,会先检查该chunk前一个chunk是否为空闲,如果是空,则合并。
利用思路是溢出修改被free的chunk头部的pre chunk size和size中的p位为0,导致合并空闲chunk。并在相邻处伪造一个chunk头部。最终得到一个任意地址写。
实例说明
以how2heap的unsafe_unlink为例子说明,程序的注释已经去掉
uint64_t *g_fake_chunk; //a
int main()
{
int malloc_size = 0x80; //we want to be big enough not to use fastbins
int header_size = 2;
g_fake_chunk = (uint64_t*) malloc(malloc_size); //chunk0
uint64_t *chunk1_ptr = (uint64_t*) malloc(malloc_size); //chunk1 b
g_fake_chunk[2] = (uint64_t) &g_fake_chunk-(sizeof(uint64_t)*3); //c
堆利用之unlink
最新推荐文章于 2025-05-26 09:34:30 发布