glibc-2.32 malloc(): unaligned tcache chunk detected
从 glibc 2.32 版本开始,官方在 malloc 从 Tcache 中取出内存块的代码里加了一行检查:取出的内存地址,必须能够被 16 整除(也就是地址的最后一位必须是 0)。 如果最后一位不是 0(比如你这里的 8),glibc 会立刻判定 Tcache 链表被黑客破坏,并抛出如下致命报错:malloc(): unaligned tcache chunk detected
随后程序直接 abort() 退出,你的利用链就此中断。
我们可以看一道题去了解这个报错:
在 [ISCC 2024]chaos_plus 中出现了这样的报错信息:b’malloc(): unaligned tcache chunk detected\n’
1 | add(0x30, p64(0) * 3 + p64(0x21) + p64((heap >> 12) ^ (stack - 8))) |
- 存放返回地址的 stack 指针是
0x7ffd3bb7a148(注意它的尾数是 8)。 - 正确脚本的目标 stack + 8:
0x7ffd3bb7a148 + 8 = 0x7ffd3bb7a150(尾数变成 0)。 - 结果我改的目标 stack + 16:
0x7ffd3bb7a148 + 16 = 0x7ffd3bb7a158(尾数又变回了 8)。
这就是 glibc-2.32 版本后由于取出的内存地址,不能够被 16 整除,用来防范 tcachebin poisoning 的报错。
所以正确脚本是:
1 | add(0x30, p64(0) * 3 + p64(0x21) + p64((heap >> 12) ^ (stack - 8))) |
相同位置填入相同信息即可。
更新: 2026-04-28 13:24:12
原文: https://www.yuque.com/idcm/wnemg9/bggcglinyu0mx14p