UnSortedbin_leak_libc_base
Unsorted Bin 指针到 main_arena 自身的偏移
当你把一个 Chunk 放进空无一物的 Unsorted Bin 时,它的 fd 和 bk 指针会指向 Unsorted Bin 的链表头。这个链表头在 main_arena 结构体内部,具体偏移如下(以64位系统为例):
| Ubuntu 版本 | glibc 版本 | main_arena 偏移 | Unsorted Bin 内部偏移 | 泄露地址到 libc_base 的总偏移 |
|---|---|---|---|---|
| Ubuntu 16.04 | 2.23 | 0x3c4b20 |
+ 0x58(88) |
0x3c4b78 |
| Ubuntu 18.04 | 2.27 | 0x3ebc40 |
+ 0x60(96) |
0x3ebca0 |
| Ubuntu 20.04 | 2.31 | 0x1ebb80 |
+ 0x60(96) |
0x1ebbe0 |
| Ubuntu 22.04 | 2.35 | 0x21ac80 |
+ 0x60(96) |
0x21ace0 |
我们会发现 Ubuntu16 版本与其他版本的 UnSortedbin 内部偏移都不相同,这是 glibc 的结构问题导致的:
在 glibc 2.27 中,malloc_state(即 main_arena 的结构体)内部增加了一个标志位变量。 结构体开头原本是:
mutex(4字节)flags(4字节)fastbinsY指针数组
在 2.27 以后,加入了一个 int have_fastchunks; (4字节)。为了保证后续指针数组 fastbinsY 满足 8 字节对齐,编译器进行了内存填充,这就导致从 fastbinsY 开始,后面所有的成员(包括 top、last_remainder 以及 bins 数组)全都被往后推迟了 8 个字节。 因为 Unsorted Bin 的链表头位于 bins 数组的最前端(通过公式 &bins[0] - 0x10 计算得出),所以它的偏移也就从原来的 88 变成了 96。
更新: 2026-04-24 20:46:01
原文: https://www.yuque.com/idcm/wnemg9/rn25h8vlgfi75r4g