First Fit

支持HackTricks

First Fit

当你在程序中使用glibc释放内存时,会使用不同的“bins”来管理内存块。以下是两种常见情况的简化解释:未排序的bins和fastbins。

未排序的Bins

当你释放一个不是快速块的内存块时,它会进入未排序的bin。这个bin就像一个列表,新释放的块会被添加到前面(“头部”)。当你请求一个新的内存块时,分配器会从后面(“尾部”)查看未排序的bin,以找到一个足够大的块。如果未排序的bin中的块比你需要的大,它会被分割,返回前部分,并保留剩余部分在bin中。

示例:

  • 你分配了300字节(a),然后250字节(b),释放a并再次请求250字节(c)。

  • 当你释放a时,它进入了未排序的bin。

  • 如果你再次请求250字节,分配器会在尾部找到a并将其分割,返回符合你请求的部分,保留剩余部分在bin中。

  • c将指向先前的a并填充a的内容。

char *a = malloc(300);
char *b = malloc(250);
free(a);
char *c = malloc(250);

Fastbins

Fastbins are used for small memory chunks. Unlike unsorted bins, fastbins add new chunks to the head, creating a last-in-first-out (LIFO) behavior. If you request a small chunk of memory, the allocator will pull from the fastbin's head.

Example:

  • You allocate four chunks of 20 bytes each (a, b, c, d).

  • When you free them in any order, the freed chunks are added to the fastbin's head.

  • If you then request a 20-byte chunk, the allocator will return the most recently freed chunk from the head of the fastbin.

char *a = malloc(20);
char *b = malloc(20);
char *c = malloc(20);
char *d = malloc(20);
free(a);
free(b);
free(c);
free(d);
a = malloc(20);   // d
b = malloc(20);   // c
c = malloc(20);   // b
d = malloc(20);   // a

其他参考资料和示例

Last updated