堆利用之unlink

本文详细介绍了堆内存管理中的unlink操作,以及如何通过篡改chunk头部进行堆利用,实现任意地址写。通过一个具体的实例,解释了如何构造chunk头部,使得在free过程中触发unlink,并控制内存布局以达到预期效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值