:Glibc 2.23→2.35 关键变化速查表(重点!))
写在前面在 PWN 题中你拿到的远程环境是什么 Ubuntu 版本直接决定了你能用什么利用手法。很多新手拿着 Glibc 2.23 的老解法去打 2.35 的环境撞得头破血流却说 Exploit 写错了。从 2.23 到 2.35Glibc 经历了数次“地震级”的安全加固。本文将为你梳理这条演进路线并奉上 PWN 手必备的速查表。这是决定你能否在高版本环境生存的核心知识 目录为什么 Glibc 版本是 PWN 的分水岭核心演进历程从 2.23 到 2.35 发生了什么 Glibc 2.23→2.35 PWN 关键变化速查表地震级更新详读Hooks 的陨落 (2.34)高版本生存指南没有 Hook 我们怎么打1. 为什么 Glibc 版本是 PWN 的分水岭不同的 Ubuntu LTS长期支持版默认绑定不同的 Glibc 版本Ubuntu 16.04 - Glibc 2.23Ubuntu 18.04 - Glibc 2.27Ubuntu 20.04 - Glibc 2.31Ubuntu 22.04 - Glibc 2.35Glibc 的更新主要针对堆管理和** Hook 机制**进行了疯狂修补。如果你不知道目标版本的查杀机制你的 Double Free、你的 Hook 劫持统统会变成malloc(): unsorted double linked list corrupted然后无情退出。2. 核心演进历程从 2.23 到 2.35 发生了什么2.23 时代古典时代没有 TcacheFastbin 攻击是主流。__malloc_hook和__free_hook像没人管的大门随便覆写拿 Shell。2.27 时代Tcache 降临引入了 Tcache线程本地缓存。堆块释放优先进入 TcacheFastbin 攻击大量失效。但 Tcache 早期没有任何检查导致 Tcache Poisoning投毒横行。2.29 ~ 2.31 时代查杀加剧Tcache 增加了key字段用于检测 Double FreeUnsorted Bin 的链表检查变得极其严格传统的 Unsorted Bin Attack 宣告死刑。2.34 ~ 2.35 时代至暗时刻彻底移除了所有的 Hook 函数__malloc_hook、__free_hook、__realloc_hook全部变成了废弃符号。传统一招鲜吃遍天的打法彻底失效强制要求转向 IO_FILE 攻击或栈劫持。3. Glibc 2.23→2.35 PWN 关键变化速查表这是本篇的核心建议截图或收藏备用Glibc 版本对应 Ubuntu核心安全机制变更受影响的经典攻击手法现行主流利用思路2.2316.04无 TcacheFastbin 检查较弱Fastbin Double Free, __malloc_hook 覆写Fastbin Attack - One_gadget2.2718.04引入 TcacheTcache 无 Double Free 检查Fastbin 攻击失效Tcache Double Free 泛滥Tcache Poisoning - __free_hook2.2919.04Tcache 引入key字段防 Double FreeUnsorted Bin 加强 size 检查Tcache Double Free 失效Unsorted Bin Attack 失效破坏 key 字段 - Tcache Poisoning - Hook2.3120.04进一步加强各种链表完整性检查Tcache 指针加密 (Protpor)堆指针伪造难度增加同上需绕过 key 检查2.3421.04彻底移除__malloc_hook/__free_hook所有依赖 Hook 的利用手法全部报废转向 IO_FILE (FSOP) 或_rtld_global劫持2.3522.04巩固 2.34 变更加强指针混淆与 TLV 检查IO_FILE 部分老手法受限House of Apple, 栈劫持 (ret2libc/ROP)4. 地震级更新详读Hooks 的陨落 (2.34)在 2.34 之前我们只要有任意地址写就能拿 Shell。比如申请一个堆块。利用 UAF 或溢出把__free_hook的地址写进堆的fd指针。把__free_hook分配出来写入system函数的地址。程序下一次调用free(/bin/sh)时实际执行了system(/bin/sh)。假设性说明模拟 2.34 环境下的崩溃假设你在 Ubuntu 22.04 (Glibc 2.35) 下尝试老套路用 GDB 查看目标地址pwndbg p __free_hook $1 (data variable, no debug info *) 0x0你会发现这个地址变成了0x0它不再是全局变量了相关的跳转逻辑在汇编层面也被直接删掉。你辛辛苦苦写进去的system地址根本没有人去执行。这就意味着一切依赖 Hook 的 Exploit 在 2.34 以上彻底成为废代码。5. 高版本生存指南没有 Hook 我们怎么打既然大门Hook被封死了我们就得翻窗。在 2.34/2.35 环境下通常有以下两种翻窗姿势5.1 IO_FILE (FSOP) 攻击程序在退出或刷新缓冲区时会调用_IO_flush_all_lockp这个函数会遍历 IO 链表并调用虚函数表里的函数。我们可以伪造一个恶意的_IO_FILE结构体篡改它的虚函数表指针。当程序退出时就会执行我们伪造的虚函数从而劫持执行流例如跳转到一个特定的 ROP Gadget即 House of Apple 系列手法。5.2 栈劫持如果我们能泄露到 Environ 指针位于 libc 中指向栈上的环境变量我们就能得到栈地址。有了栈地址配合任意地址写我们可以直接把 ROP 链写到栈上比如覆盖__libc_start_main的返回地址直接用 ROP 调用system或execve绕过一切 Hook。6. 结语Glibc 的演进史就是一部攻防对抗史。作为 PWN 选手我们必须牢记拿到题目第一步先看 Glibc 版本2.23 有 2.23 的打法2.35 有 2.35的优雅。不要试图用过时的武器打新版本的补丁。下一部分我们将暂停宏观视角回到微观的汇编世界速查那些必须倒背如流的核心汇编指令。如果本文对你有帮助请点赞收藏支持