1:对 inuse 的 fastbin 进行 extend
int main(void)
{
void *ptr,*ptr1;
ptr=malloc(0x10);//分配第一个0x10的chunk
malloc(0x10);//分配第二个0x10的chunk
//
*(long long *)((long long)ptr-0x8)=0x41;// 修改第一个块的size域
free(ptr);
//
ptr1=malloc(0x30);// 实现 extend,控制了第二个块的内容
return 0;
}
原因:符合fastbin chunk大小的chunk被释放时,只根据chunk的size将其放入到特定的fastbinY中
2:对 inuse 的 small bin 进行 extend
#include <malloc.h>
int main()
{
size_t *ptr,*ptr1;
ptr=malloc(0x80);//分配第一个 0x80 的chunk1
malloc(0x10); //分配第二个 0x10 的chunk2
malloc(0x10); //防止与top chunk合并
ptr[-1] = 0xb1;
free(ptr);
ptr1=malloc(0xa0);
}
原因:
free(ptr)
会将ptr放入到unsorted bin中- 在执行
ptr1=malloc(0xa0)
时- 首先会回计算出0xa0是属于small bin的范围,会尝试到small bin中去找,但是现在small bin是空的
- 整理unsorted bin 链中的chunk,当ptr chunk从unsorted bin被摘出后,会立即比较ptr chunk的size是否与ptr1请求的size相同, 相同就会直接取出,没有其他检查
/* remove from unsorted list */
unsorted_chunks (av)->bk = bck;
bck->fd = unsorted_chunks (av);
/* Take now instead of binning if exact fit */
if (size == nb)
{
set_inuse_bit_at_offset (victim, size);
if (av != &main_arena)
victim->size |= NON_MAIN_ARENA;
check_malloced_chunk (av, victim, nb);
void *p = chunk2mem (victim);
alloc_perturb (p, bytes);
return p;
}
3:对 free 的 small bin 进行 extend
#include <malloc.h>
int main()
{
size_t *ptr,*ptr1;
ptr=malloc(0x80);//分配第一个0x80的chunk1
malloc(0x10);//分配第二个0x10的chunk2
free(ptr);//首先进行释放,使得chunk1进入unsorted bin
ptr[-1] = 0xb1;
ptr1=malloc(0xa0);
}
原因:和2:对 inuse 的 small bin 进行 extend
一致
how2heap 2.23 overlapping_chunks 与此 相似
4:通过 extend 后向 overlapping
#include <malloc.h>
int main()
{
size_t *ptr,*ptr1;
ptr=malloc(0x10);//分配第1个 0x80 的chunk1
malloc(0x10); //分配第2个 0x10 的chunk2
malloc(0x10); //分配第3个 0x10 的chunk3
malloc(0x10); //分配第4个 0x10 的chunk4
ptr[-1] =0x61;
free(ptr);
ptr1=malloc(0x50);
}
原因:和1:对 inuse 的 fastbin 进行 extend
一致,两个代码片段的作用没看出有啥区别
5:通过 extend 前向 overlapping
#include <malloc.h>
int main(void)
{
size_t *ptr1,*ptr2,*ptr3,*ptr4;
ptr1 = malloc(128);//smallbin1
ptr2 = malloc(0x10);//fastbin1
ptr3 = malloc(0x10);//fastbin2
ptr4 = malloc(128);//smallbin2
malloc(0x10);//防止与top合并
free(ptr1);
ptr4[-1] = 0x90;//修改pre_inuse域
ptr4[-2] = 0xd0;//修改pre_size域
free(ptr4);//unlink进行前向extend
malloc(0x150);//占位块
return 0;
}
原因:通过修改ptr4的pre_inuse,ptr4的pre_size,使得glibc malloc管理器认为ptr1和ptr2虚拟内存相邻,释放ptr4后触发unlink进行前向extend。数值正常,可以正常申请 malloc(0x150)
how2heap 2.23 overlapping_chunks_2 原理与此相似