ofd文件阅读器的漏洞挖掘与分析
字数 1287 2025-08-20 18:18:17
OFD文件阅读器漏洞挖掘与分析技术文档
1. 概述
OFD(Open Fixed-layout Document)是由中国电子技术标准化研究院制定的版式文档国家标准。本文档详细记录了针对国产OFD阅读器软件的漏洞挖掘与分析过程,包括动态Fuzzing和静态分析技术。
2. 动态漏洞挖掘
2.1 工具准备
-
主要工具:
- WinAFL: Windows平台上的模糊测试框架
- DynamoRIO: 动态二进制插桩工具
- ProcMon: 进程监控工具
- IDA Pro: 反汇编与逆向分析工具
- StudyPE: PE文件分析工具
- x64dbg: 调试器
-
测试环境:
- Windows 10 1909 64位
- 目标软件: SuwellReader.exe (版本1.6.6.29)
2.2 Fuzzing流程
2.2.1 函数偏移定位
- 使用ProcMon监控程序行为,确定文件处理流程
- 通过IDA静态分析结合动态调试,寻找接近调用栈底部的函数偏移
- 选择能够覆盖最大解析逻辑的函数作为Fuzzing目标
2.2.2 文件句柄管理
- 定位创建文件句柄的函数尾部偏移
- 定位完全读取文件后的函数偏移
- 在这些位置插入关闭文件句柄的代码
2.2.3 WinAFL调试模式测试
drrun.exe -c winafl.dll -debug -target_module SuwellReader.exe -target_offset 0x195b30 -call_convention fastcall -nargs 2 -fuzz_iterations 10 -- C:\target\shuke\Suwell\Reader_Pro\SuwellReader.exe C:\fuzztools\manul\input\PDFBOX-1074-1.pdf
2.2.4 样本处理
-
PDF样本获取:
- 公开Fuzzing样本集
- 搜索引擎爬取
- 使用libfuzzer/honggfuzz生成样本
-
样本裁剪:
- 使用winafl-cmin.py脚本筛选触发新路径的样本
2.2.5 正式Fuzzing
afl-fuzz.exe -i in -o out -t 20000 -m none -D C:\fuzz\fuzz_tools\dyn\dyn\bin32\ -M fuzz1 -- -covtype bb -call_convention fastcall -target_module SuwellReader.exe -target_offset 0x195b30 -coverage_module SuwellReader.exe -fuzz_iterations 50000 -nargs 2 -- C:\fuzz\fuzz_tools\Reader_Pro\SuwellReader.exe @@
2.3 OFD文件Fuzzing的特殊处理
2.3.1 样本获取挑战
- 互联网上公开OFD样本稀少
- 解决方案: PDF转OFD
- 使用自动化工具(AutoHotkey/按键精灵)批量转换
- 示例转换脚本:
Function SaveToOfd
mm = lib.API.查找窗口句柄(0, "ofd阅读器")
Call Lib.API.激活窗口并置前(mm)
MoveTo 46, 50
LeftClick 1
Delay 500
LeftUp 1
MoveTo 115, 282
LeftClick 1
Delay 500
MoveTo 1011, 708
LeftClick 1
Delay 500
MoveTo 1372, 719
Delay 500
LeftClick 1
KeyDown "Ctrl", 1
Delay 490
Delay 31
KeyDown "Ctrl", 1
Delay 22
KeyDown "W", 1
Delay 180
KeyUp "W", 1
Delay 16
KeyUp "Ctrl", 1
Delay 6
End Function
2.3.2 ZIP格式处理
- OFD本质是ZIP压缩包包含XML文件
- 开发post_library模块处理变异后的数据:
extern "C" __declspec(dllexport)const unsigned char* afl_postprocess(const unsigned char* in_buf,
unsigned int* len,unsigned char* id)
{
// ZIP压缩处理代码
// ...
return zipbuf;
}
3. 静态漏洞挖掘
3.1 开源组件识别
使用Karta工具识别闭源程序中的开源组件:
- libpng: 1.6.37
- zlib: 1.2.11
- libxml2: 20901
- libtiff: unknown
- libjpeg: 9a
3.2 历史漏洞测试
- 测试libjpeg历史漏洞(无果)
- 测试libxml2历史漏洞:
- 发现堆越界读和释放后重引用漏洞
4. 线程竞争漏洞分析
4.1 漏洞表现
- 多线程环境下全局变量访问冲突
- 导致释放后重引用(UAF)
4.2 根本原因
-
QT的QMutex误用:
- 每次线程传入不同的QMutex对象
- lock操作对不同对象无效
- 无法实现真正的线程同步
-
关键代码分析:
push ebx
push esi
mov ebx, 1
xor eax, eax
push edi
mov edi, ecx
mov edx, ebx
lock cmpxchg [edi], edx
mov esi, eax
test esi, esi
jz short loc_67028549
4.3 调试验证
使用Windbg验证QMutex对象:
QMutex:5E9C2FF8-->00000000
QMutex:68214FF8-->00000000
QMutex:63246FF8-->00000000
QMutex:646EEFF8-->00000000
QMutex:60DD8FF8-->00000000
5. 总结
- 通过动态Fuzzing发现5个不同类型漏洞
- 静态分析发现开源组件历史漏洞
- 深入分析线程竞争漏洞及其根本原因
- 所有发现漏洞已提交CNVD并修复
6. 经验教训
- 新版DynamoRIO性能问题需注意
- OFD样本处理需要特殊方法
- QT多线程编程需正确使用同步机制
- 闭源程序分析需结合多种工具和技术