64位系统以下各字段均为8字节,32位系统为4字节。
glibc2.26及以上版本有tcache机制。咱目前也不太懂,快刀斩乱麻,glibc2.25的实验在Ubuntu16.04上做,glibc版本信息如下:
5. unsafe_unlink.c
运行结果:
分析:
题外话,观察到,对于同一个可执行文件unsafe_unlink,每次运行打印的地址不同,而每次调试则相同。希望以后理解。
伪造的堆块为chunk0,就是下图红框中的内容。可以看到,它舍弃了分配的堆块的首部两个单元。
chunk0_ptr[2] = (uint64_t) &chunk0_ptr-(sizeof(uint64_t)*3);
chunk0_ptr[3] = (uint64_t) &