tcache各版本变化

glibc-2.27

第一次出现tcache
可以随意double free

glibc-2.29

在每个free到tcache的chunk的bk位置加入tcache管理器的地址,用于doublefree检测。
——————————————————————————————————————————————————

unlink各版本变化

glibc-2.27及以前

将待unlink chunk称为p,它fd指针指向的chunk为FD,bk指针指向的为BK。
检测FD的bk是否为p,以及BK的fd是否为p,如果是则执行unlink。
源码:https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=ef04360b918bceca424482c6db03cc5ec90c3e00;hb=07c18a008c2ed8f5660adba2b778671db159a141#l1344

1
2
3
4
FD = P->fd;                                                               
BK = P->bk;
if (__builtin_expect (FD->bk != P || BK->fd != P, 0))
malloc_printerr (check_action, "corrupted double-linked list", P, AV);

glibc-2.31

添加了待p的size与相邻高地址chunk的prevsize是否相等的检查
源码更新log:https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=d6db68e66dff25d12c3bc5641b60cbd7fb6ab44f

1
2
+ if (__glibc_unlikely (chunksize(p) != prevsize))
+ malloc_printerr ("corrupted size vs. prev_size in fastbins");

——————————————————————————————————————————————————

doublefree各版本变化

glibc-2.29

在tcache的chunk的bk位置加入key,防止进入tcache的chunk double free。

unsorted bin大小范围

chunk 用户空间>=0x80 即至少malloc(0x80)

tcache大小范围

chunk 用户空间>= 0x420 即malloc(0x420)
另外calloc可以直接绕过tcache