堆学习之利用bss段伪造堆块
字数 1906 2025-08-29 22:41:01
利用BSS段伪造堆块技术详解
技术背景
本技术主要应用于Linux平台下的堆漏洞利用场景,特别是针对未开启PIE保护的可执行程序。通过利用BSS段中的全局变量区域伪造堆块结构,可以绕过堆管理器的安全检查,实现信息泄露和最终控制程序执行流。
环境要求
- 目标程序未开启PIE保护(BSS段地址固定)
- GOT表可写(用于最终劫持控制流)
- 存在UAF(Use-After-Free)漏洞
- 程序提供对BSS段全局变量的读写能力
技术原理
1. BSS段伪造堆块
在未开启PIE的程序中,BSS段的地址是固定的。通过在BSS段中伪造堆块结构(包括size字段和必要的指针),可以欺骗堆管理器将其视为合法的堆块。
2. Fastbin Double Free
利用UAF漏洞构造Double Free,将伪造的BSS段堆块地址链入fastbin链表中,然后通过malloc申请出来。
3. Unsorted Bin泄露libc
将伪造的堆块放入unsorted bin中,利用unsorted bin的特性(包含main_arena的指针)来泄露libc基址。
详细步骤
第一阶段:泄露libc基址
-
初始化BSS段伪造堆块
- 在BSS段全局变量区域构造伪造堆块
- 设置size字段为0x60(fastbin大小)
- 示例地址:0x6020c0
-
构造Double Free
- 通过UAF漏洞释放同一chunk两次
- 将BSS段伪造堆块地址链入fastbin
-
申请伪造堆块
- 从fastbin中申请出伪造的BSS段堆块
- 此时可以控制BSS段的部分区域
-
准备放入unsorted bin
- 修改伪造堆块的size为0x91(unsorted bin大小)
- 在伪造堆块后构造两个额外的伪造堆块(size分别为0x10和0x10)
- 这是为了绕过unsorted bin的检查:
if (__builtin_expect (chunksize(P) != prev_size (next_chunk(P)), 0)) malloc_printerr ("corrupted size vs. prev_size");
-
释放到unsorted bin
- 释放伪造的堆块,使其进入unsorted bin
- unsorted bin中的chunk会包含main_arena的指针
-
泄露libc地址
- 通过打印BSS段全局变量的内容泄露libc地址
- 注意处理printf的截断问题(填充非零字节)
第二阶段:GetShell
-
再次构造Double Free
- 目标是劫持malloc_hook
-
申请到malloc_hook附近
- 不能直接申请malloc_hook,而是申请malloc_hook-0x23的位置
- 原因:需要满足fastbin的size检查(对应fastbin大小)
-
覆盖malloc_hook
- 将malloc_hook覆盖为one_gadget地址
- 注意one_gadget的约束条件
-
触发malloc
- 通过调用malloc触发one_gadget
- 注意某些情况下需要在终端手动输入而非通过脚本
GLIBC 2.23与2.27的区别
-
tcache机制
- 2.27引入了tcache,减少了安全检查
- 可以直接连续free相同的chunk而不触发double free检查
-
unsorted bin的size要求
- 2.27中,smallbin范围的size会优先进入tcache
- 需要设置更大的size(如0x501)确保进入unsorted bin
-
写入限制
- 2.27可能需要更多步骤来构造完整的伪造堆块链
- 可能需要多次double free来写入所有必要的字段
防御措施
- 开启PIE保护
- 使用最新的GLIBC版本(增加了更多安全检查)
- 避免在BSS段存储用户可控的敏感数据
- 正确实现堆管理,避免UAF漏洞
实际案例
tgctf--heap (GLIBC 2.23)
- 特点:没有show功能,但提供name全局变量的读写
- 利用步骤:
- 在BSS段伪造0x60大小的堆块
- 通过double free将其链入fastbin
- 申请出来后修改size为0x91
- 构造三个伪造堆块后释放到unsorted bin
- 通过name泄露libc地址
- 再次double free劫持malloc_hook
pwnable.tw--tcache_tear (GLIBC 2.27)
- 特点:存在tcache机制
- 关键区别:
- 需要设置更大的size(0x501)绕过tcache
- double free更容易构造
- 需要更多步骤来写入完整的伪造堆块链
总结
利用BSS段伪造堆块是一种有效的堆利用技术,特别适用于未开启PIE保护的程序。通过精心构造堆块结构和利用程序提供的全局变量读写能力,可以绕过堆管理器的安全检查,最终实现任意代码执行。理解不同GLIBC版本间的差异对于成功利用至关重要。