Small-Bin
September 1, 2019 PWN 访问: 26 次
ptmalloc
使用small bins
来管理空闲小chunk
,每个small bins
中的大小与bin
的index
关系如下:
Chunk suze = 2 * SIZE_SZ * index
无论是32位程序还是64位程序,small bins
都有62个bin
;32位程序的small bins
的大小是以8bit为公差的等差序列,分别为16、24、32、48、…、504。64位程序的small bins
的大小是以16bit为公差的等差序列,分别为32、48、64、…、1008。
small bins
的每一个bin都是一个双 向列表,每个bin中chunk的大小是一致的,就像fast bins
是一样的。
图示:
首先我想到一个问题,fast bin
中chunk
的大小范围是0x20~0x80
,而small bins
中chunk
的大小范围是0x20~0x3f0
,重叠了0x20~0x80
,那为什么不直接进入到fast bin
中而是进入到了small bin
中呢?,0x20~0x80
范围内的chunk
是怎么进入到small bin
中呢?
回过头重新看了一下Unsorted bin
的管理机制,恍然大悟;当我们释放的chunk
在0x20~0x80
,会直接进入到fast bin
,当我们释放的chunk
大小大于0x80
的时候,就会进入到Unsorted bin
中,当再次申请chunk
时,首先会遍历fast bin
有没有合适的chunk
,若没有,那么就会遍历Unsorted bin
,如果有相同大小的chunk的话就会直接返回给用户,若是没有相同大小的chunk,则会分割一块大的chunk然后返回给用户,剩余的chunk就会被按照大小分配到small bin
或者是large bin
中
测试代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *heap_1, *heap_2,*heap_3,*heap_4;
heap_1 = malloc(0x80);
heap_4 = malloc(0x80);
heap_2 = malloc(0x100);
heap_3 = malloc(0x10);
printf("heap_1:%p\n", heap_1);
printf("heap_2:%p\n", heap_2);
free(heap_1);
free(heap_2);
heap_3 = malloc(0x80);//trigger
printf("heap_3:%p\n", heap_3);
return 0;
}