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 函数偏移定位

  1. 使用ProcMon监控程序行为,确定文件处理流程
  2. 通过IDA静态分析结合动态调试,寻找接近调用栈底部的函数偏移
  3. 选择能够覆盖最大解析逻辑的函数作为Fuzzing目标

2.2.2 文件句柄管理

  1. 定位创建文件句柄的函数尾部偏移
  2. 定位完全读取文件后的函数偏移
  3. 在这些位置插入关闭文件句柄的代码

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 样本处理

  1. PDF样本获取:

    • 公开Fuzzing样本集
    • 搜索引擎爬取
    • 使用libfuzzer/honggfuzz生成样本
  2. 样本裁剪:

    • 使用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 样本获取挑战

  1. 互联网上公开OFD样本稀少
  2. 解决方案: 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格式处理

  1. OFD本质是ZIP压缩包包含XML文件
  2. 开发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 历史漏洞测试

  1. 测试libjpeg历史漏洞(无果)
  2. 测试libxml2历史漏洞:
    • 发现堆越界读和释放后重引用漏洞

4. 线程竞争漏洞分析

4.1 漏洞表现

  1. 多线程环境下全局变量访问冲突
  2. 导致释放后重引用(UAF)

4.2 根本原因

  1. QT的QMutex误用:

    • 每次线程传入不同的QMutex对象
    • lock操作对不同对象无效
    • 无法实现真正的线程同步
  2. 关键代码分析:

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. 总结

  1. 通过动态Fuzzing发现5个不同类型漏洞
  2. 静态分析发现开源组件历史漏洞
  3. 深入分析线程竞争漏洞及其根本原因
  4. 所有发现漏洞已提交CNVD并修复

6. 经验教训

  1. 新版DynamoRIO性能问题需注意
  2. OFD样本处理需要特殊方法
  3. QT多线程编程需正确使用同步机制
  4. 闭源程序分析需结合多种工具和技术
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调试模式测试 2.2.4 样本处理 PDF样本获取 : 公开Fuzzing样本集 搜索引擎爬取 使用libfuzzer/honggfuzz生成样本 样本裁剪 : 使用winafl-cmin.py脚本筛选触发新路径的样本 2.2.5 正式Fuzzing 2.3 OFD文件Fuzzing的特殊处理 2.3.1 样本获取挑战 互联网上公开OFD样本稀少 解决方案: PDF转OFD 使用自动化工具(AutoHotkey/按键精灵)批量转换 示例转换脚本: 2.3.2 ZIP格式处理 OFD本质是ZIP压缩包包含XML文件 开发post_ library模块处理变异后的数据: 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操作对不同对象无效 无法实现真正的线程同步 关键代码分析: 4.3 调试验证 使用Windbg验证QMutex对象: 5. 总结 通过动态Fuzzing发现5个不同类型漏洞 静态分析发现开源组件历史漏洞 深入分析线程竞争漏洞及其根本原因 所有发现漏洞已提交CNVD并修复 6. 经验教训 新版DynamoRIO性能问题需注意 OFD样本处理需要特殊方法 QT多线程编程需正确使用同步机制 闭源程序分析需结合多种工具和技术