fastbin Misalignment Attack 错位伪造 chunk
这个其实没有说专门去了解过这种攻击手法,不过在很多题目当中都遇到过。大概是什么意思呢:
比如我们在 fastbin 链表中伪造了某个 bin,glibc 是要检查 size 的大小是否符合申请的堆块大小的。
但在我们伪造的 chunk 当中并不存在这么个 size 位,使得能够通过 size 的判断条件。
此时我们就需要通过 UAF 或者堆溢出去修改当前 fake_chunk 的 size 位去绕过这个判断。
不过这就带出了一系列问题:size 值从哪里来?即使 size 问题解决了,又怎么在 fake_chunk 内填入合适的内容去篡改已知函数?例如 free_got,malloc_got 等。
利用这里的 malloc_state 劫持的一个例子:https://www.yuque.com/idcm/wnemg9/vsshwez1mw2565xg
Fastbin Attack 错位构造
1 | add(0x60, 0, (b'/bin/sh'.ljust(0xB, b'\x00') + p64(system_plt)).ljust(0x60, b'\x00')) |
前提是我们当前把 chunk 伪造到了 0x60201d 的地方,伪造 chunk 大小为 0x70
- 我们将 chunk 从伪造的 fastbin 当中申请出来,并覆盖目标函数指针。
- add(0x60) 在底层会申请一个大小为 0x70 的 Chunk。Fastbin 在分配时,会检查 Chunk 头部的 size 字段是否合法(必须是 0x7 开头)。 攻击者在 BSS 段,通常在 0x602000 附近,挑选了 0x60201d 这个地址。在这个地址的偏移 +8 处,即 0x602025内存中恰好有一个字节,恰好可以欺骗绕过 Fastbin 的 Size 检查。
- malloc 成功返回了用户指针:0x60201d+0x10=0x60202d。
- 我们向这个地址写入数据:b’/bin/sh’.ljust(0xB, b’\x00’),一共占据 11 字节,从 0x60202d 写到 0x602037
- 紧接着写下 p64(system_plt)。这个 8 字节正好落在 0x602038 上
- 而 0x602038 恰好就是全局函数指针 p_write_w 在 BSS 段中的绝对地址
触发 system(‘/bin/sh’)获取 shell
1 | read_1((__int64)v6, size); |
当 add 的逻辑执行完毕时,程序按惯例会调用: p_write_w(v6, size); 但在我们篡改内存之后:内存变成 system(0x60202d);而我们在 0x60202d 写入了字符串 “/bin/sh\x00”。触发 system(‘/bin/sh’);
至此:
这个题目就利用了 fastbin 的错位构造,解决了 size 位和篡改敏感函数的问题,成功调用了 system(‘/bin/sh’);
这里做个记录,防止自己遗漏这个知识点。
更新: 2026-04-19 18:46:06
原文: https://www.yuque.com/idcm/wnemg9/egs94d3zqwhhzr0n