Small-Bin

September 1, 2019 PWN 访问: 26 次

ptmalloc使用small bins来管理空闲小chunk,每个small bins中的大小与binindex关系如下:

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 binchunk的大小范围是0x20~0x80,而small binschunk的大小范围是0x20~0x3f0,重叠了0x20~0x80,那为什么不直接进入到fast bin中而是进入到了small bin中呢?,0x20~0x80范围内的chunk是怎么进入到small bin中呢?
回过头重新看了一下Unsorted bin的管理机制,恍然大悟;当我们释放的chunk0x20~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;
}

添加新评论