长城杯2025 pwn-typo
字数 1354 2025-08-29 08:30:06

长城杯2025 pwn-typo漏洞分析与利用教学

1. 题目概述

这是一道来自长城杯2025 AWDP比赛的pwn题目,名为"typo"。程序功能相对简单,主要特点包括:

  • 没有show功能及相关可利用输出
  • 主要漏洞点在格式化字符串函数snprintf的误用
  • 需要采用无泄漏或io leak技术进行利用

2. 漏洞分析

2.1 漏洞点定位

漏洞存在于snprintf函数的错误使用上,与CVE-2024-12987(2960栈溢出漏洞)相似:

  • 可以读入最多0x100字节
  • 可以利用格式化字符串(如%s, %c)传递栈上数据
  • 末尾会自动补上null字节

2.2 溢出利用方式

有两种主要的利用方式:

  1. snprintf参数解析错误利用

    • 利用格式化字符串特性绕过某些bad byte
    • 最大输入0x100字节
    • 自动补null字节
  2. snprintf+read组合利用

    • 第一次用snprintf溢出堆块中的size部分
    • 第二次用read截断null字符
    • 这种方法可以避免自动补null的问题

3. 利用思路

3.1 制造重合指针

由于没有UAF漏洞,需要通过以下步骤制造重合指针:

  1. 将堆块送入tcache
  2. 进行溢出篡改next指针末尾
  3. malloc两次获得指向同一地址的两个指针

注意事项

  • 最初可能忘记用read避免多余的null
  • 需要将目标堆块填充到合适位置

3.2 泄露技术

采用io leak技术进行地址泄露:

  1. 地址获取

    • 使用unsorted bin在tcache上"踩"出一个地址
  2. 具体操作

    • 篡改重合指针堆块的size(原tcache已被破坏)
    • 将size扩大到另一个size以避免问题
    • 先送入tcache,修改inuse位和key避免触发double free
    • 然后释放进unsorted bin获取地址
  3. io leak实现

    • 使用read溢出避免null
    • 修改末尾两字节爆破stdout
    • 实现io leak获取libc地址

4. 完整利用步骤

  1. 初始准备

    • 利用snprintf溢出制造堆块重叠
    • 创建两个指向同一地址的指针
  2. 泄露地址

    • 修改堆块size
    • 通过tcache和unsorted bin操作获取地址
    • 实现io leak泄露libc基址
  3. 最终利用

    • 获取libc地址后可采用常规方法:
      • onegadget
      • 或其他任意getshell方式

5. AWDP修复方案

在防御方面(AWDP fix),可以考虑:

  1. 简单修复

    • NOP掉snprintf调用
    • 修改malloc大小破坏堆结构使exp失效
  2. 更健壮的修复

    • 严格限制输入长度
    • 正确使用格式化字符串函数
    • 添加堆完整性检查

6. EXP示例

(原文中未提供完整exp代码,但描述了关键步骤)

7. 总结与扩展

  1. 技术要点

    • 格式化字符串在堆溢出中的特殊应用
    • 无show功能情况下的io leak技术
    • tcache与unsorted bin的组合利用
  2. 扩展思考

    • 其他可能的利用路径
    • 不同环境下的利用方式变化
    • 更简洁的利用方法探索
  3. 防御建议

    • 永远不要信任用户提供的格式化字符串
    • 严格限制所有输入的边界
    • 考虑使用更安全的替代函数

这份文档涵盖了题目分析、漏洞原理、利用技术和防御方案等关键点,可以作为该类型漏洞的学习和教学材料。

长城杯2025 pwn-typo漏洞分析与利用教学 1. 题目概述 这是一道来自长城杯2025 AWDP比赛的pwn题目,名为"typo"。程序功能相对简单,主要特点包括: 没有show功能及相关可利用输出 主要漏洞点在格式化字符串函数snprintf的误用 需要采用无泄漏或io leak技术进行利用 2. 漏洞分析 2.1 漏洞点定位 漏洞存在于snprintf函数的错误使用上,与CVE-2024-12987(2960栈溢出漏洞)相似: 可以读入最多0x100字节 可以利用格式化字符串(如%s, %c)传递栈上数据 末尾会自动补上null字节 2.2 溢出利用方式 有两种主要的利用方式: snprintf参数解析错误利用 利用格式化字符串特性绕过某些bad byte 最大输入0x100字节 自动补null字节 snprintf+read组合利用 第一次用snprintf溢出堆块中的size部分 第二次用read截断null字符 这种方法可以避免自动补null的问题 3. 利用思路 3.1 制造重合指针 由于没有UAF漏洞,需要通过以下步骤制造重合指针: 将堆块送入tcache 进行溢出篡改next指针末尾 malloc两次获得指向同一地址的两个指针 注意事项 : 最初可能忘记用read避免多余的null 需要将目标堆块填充到合适位置 3.2 泄露技术 采用io leak技术进行地址泄露: 地址获取 : 使用unsorted bin在tcache上"踩"出一个地址 具体操作 : 篡改重合指针堆块的size(原tcache已被破坏) 将size扩大到另一个size以避免问题 先送入tcache,修改inuse位和key避免触发double free 然后释放进unsorted bin获取地址 io leak实现 : 使用read溢出避免null 修改末尾两字节爆破stdout 实现io leak获取libc地址 4. 完整利用步骤 初始准备 : 利用snprintf溢出制造堆块重叠 创建两个指向同一地址的指针 泄露地址 : 修改堆块size 通过tcache和unsorted bin操作获取地址 实现io leak泄露libc基址 最终利用 : 获取libc地址后可采用常规方法: onegadget 或其他任意getshell方式 5. AWDP修复方案 在防御方面(AWDP fix),可以考虑: 简单修复 : NOP掉snprintf调用 修改malloc大小破坏堆结构使exp失效 更健壮的修复 : 严格限制输入长度 正确使用格式化字符串函数 添加堆完整性检查 6. EXP示例 (原文中未提供完整exp代码,但描述了关键步骤) 7. 总结与扩展 技术要点 : 格式化字符串在堆溢出中的特殊应用 无show功能情况下的io leak技术 tcache与unsorted bin的组合利用 扩展思考 : 其他可能的利用路径 不同环境下的利用方式变化 更简洁的利用方法探索 防御建议 : 永远不要信任用户提供的格式化字符串 严格限制所有输入的边界 考虑使用更安全的替代函数 这份文档涵盖了题目分析、漏洞原理、利用技术和防御方案等关键点,可以作为该类型漏洞的学习和教学材料。