长城杯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 溢出利用方式
有两种主要的利用方式:
-
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方式
- 获取libc地址后可采用常规方法:
5. AWDP修复方案
在防御方面(AWDP fix),可以考虑:
-
简单修复:
- NOP掉snprintf调用
- 修改malloc大小破坏堆结构使exp失效
-
更健壮的修复:
- 严格限制输入长度
- 正确使用格式化字符串函数
- 添加堆完整性检查
6. EXP示例
(原文中未提供完整exp代码,但描述了关键步骤)
7. 总结与扩展
-
技术要点:
- 格式化字符串在堆溢出中的特殊应用
- 无show功能情况下的io leak技术
- tcache与unsorted bin的组合利用
-
扩展思考:
- 其他可能的利用路径
- 不同环境下的利用方式变化
- 更简洁的利用方法探索
-
防御建议:
- 永远不要信任用户提供的格式化字符串
- 严格限制所有输入的边界
- 考虑使用更安全的替代函数
这份文档涵盖了题目分析、漏洞原理、利用技术和防御方案等关键点,可以作为该类型漏洞的学习和教学材料。