一、top chunk
- 当我们分配一块堆内存时,top chunk是出于地址的最高处的,其前面就是我们所申请的chunk。
二、top chunk的合并操作
- 如果top chunk前面的chunk不是fast chunk并且处于空闲,那么top chunk就会合并这个chunk。
- 如果top chunk前面的chunk是fast chunk,不论是否空闲,top chunk都不会合并这个chunk。
三、演示案例(不合并fast chunk)
#include <unistd.h>
#include <malloc.h>
int main()
{
int size=0x20;
void *p1=malloc(size);
void *p2=malloc(size);
sleep(0); //只为了程序打断点,无其他作用
free(p2);
return 0;
}
- 第三步:释放p2,如果top chunk前面是fast chunk,那么top chunk不会合并前面的fast chunk,fast chunk被放在fastbins中。
四、演示案例(合并unsorted chunk)
#include <unistd.h>
#include <malloc.h>
int main()
{
void *p1=malloc(0x20);
void *p2=malloc(0x100);
sleep(0); //只为了程序打断点,无其他作用
free(p2);
return 0;
}
- 第三步:释放p2(看到在释放p2之后,第2个chunk没有了,被top chunk合并了,top chunk的大小加上了第2个chunk的大小。135121=134849+272。并且bins链表中也没有该chunk)。
五、阻止top chunk合并chunk
- 如果在一个free掉的chunk后面再申请一个chunk,那么新申请的chunk处于使用状态,top chunk就不会合并前面的chunk。
#include <unistd.h>
#include <malloc.h>
int main()
{
void *p1=malloc(0x100);
void *p2=malloc(0x100);
sleep(0); //只为了程序打断点,无其他作用
free(p1);
return 0;
}
- 第三步:释放p1,可以看到第2个chunk的size从273变味了272,代表此chunk前面的chunk处于空闲状态。并且被释放的chunk被放入了unsortedbin中,而没有被top chunk合并。
- 我是小董,V公众点击"笔记白嫖"解锁更多【堆漏洞挖掘】资料内容。