堆学习之利用bss段伪造堆块
字数 1906 2025-08-29 22:41:01

利用BSS段伪造堆块技术详解

技术背景

本技术主要应用于Linux平台下的堆漏洞利用场景,特别是针对未开启PIE保护的可执行程序。通过利用BSS段中的全局变量区域伪造堆块结构,可以绕过堆管理器的安全检查,实现信息泄露和最终控制程序执行流。

环境要求

  1. 目标程序未开启PIE保护(BSS段地址固定)
  2. GOT表可写(用于最终劫持控制流)
  3. 存在UAF(Use-After-Free)漏洞
  4. 程序提供对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基址

  1. 初始化BSS段伪造堆块

    • 在BSS段全局变量区域构造伪造堆块
    • 设置size字段为0x60(fastbin大小)
    • 示例地址:0x6020c0
  2. 构造Double Free

    • 通过UAF漏洞释放同一chunk两次
    • 将BSS段伪造堆块地址链入fastbin
  3. 申请伪造堆块

    • 从fastbin中申请出伪造的BSS段堆块
    • 此时可以控制BSS段的部分区域
  4. 准备放入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");
      
  5. 释放到unsorted bin

    • 释放伪造的堆块,使其进入unsorted bin
    • unsorted bin中的chunk会包含main_arena的指针
  6. 泄露libc地址

    • 通过打印BSS段全局变量的内容泄露libc地址
    • 注意处理printf的截断问题(填充非零字节)

第二阶段:GetShell

  1. 再次构造Double Free

    • 目标是劫持malloc_hook
  2. 申请到malloc_hook附近

    • 不能直接申请malloc_hook,而是申请malloc_hook-0x23的位置
    • 原因:需要满足fastbin的size检查(对应fastbin大小)
  3. 覆盖malloc_hook

    • 将malloc_hook覆盖为one_gadget地址
    • 注意one_gadget的约束条件
  4. 触发malloc

    • 通过调用malloc触发one_gadget
    • 注意某些情况下需要在终端手动输入而非通过脚本

GLIBC 2.23与2.27的区别

  1. tcache机制

    • 2.27引入了tcache,减少了安全检查
    • 可以直接连续free相同的chunk而不触发double free检查
  2. unsorted bin的size要求

    • 2.27中,smallbin范围的size会优先进入tcache
    • 需要设置更大的size(如0x501)确保进入unsorted bin
  3. 写入限制

    • 2.27可能需要更多步骤来构造完整的伪造堆块链
    • 可能需要多次double free来写入所有必要的字段

防御措施

  1. 开启PIE保护
  2. 使用最新的GLIBC版本(增加了更多安全检查)
  3. 避免在BSS段存储用户可控的敏感数据
  4. 正确实现堆管理,避免UAF漏洞

实际案例

tgctf--heap (GLIBC 2.23)

  • 特点:没有show功能,但提供name全局变量的读写
  • 利用步骤:
    1. 在BSS段伪造0x60大小的堆块
    2. 通过double free将其链入fastbin
    3. 申请出来后修改size为0x91
    4. 构造三个伪造堆块后释放到unsorted bin
    5. 通过name泄露libc地址
    6. 再次double free劫持malloc_hook

pwnable.tw--tcache_tear (GLIBC 2.27)

  • 特点:存在tcache机制
  • 关键区别:
    • 需要设置更大的size(0x501)绕过tcache
    • double free更容易构造
    • 需要更多步骤来写入完整的伪造堆块链

总结

利用BSS段伪造堆块是一种有效的堆利用技术,特别适用于未开启PIE保护的程序。通过精心构造堆块结构和利用程序提供的全局变量读写能力,可以绕过堆管理器的安全检查,最终实现任意代码执行。理解不同GLIBC版本间的差异对于成功利用至关重要。

利用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的检查: 释放到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版本间的差异对于成功利用至关重要。