用DHARMA实现FUZZ LOGICS
字数 1537 2025-08-06 08:35:35
使用DHARMA实现模糊逻辑测试 - 详细教学指南
1. Dharma简介
Dharma是由Mozilla提供的基于迭代器的语法模糊器,它允许用户通过定义语法文件模板来生成测试用例。主要特点包括:
- 基于语法的模糊测试
- 使用迭代器生成变体
- 可针对特定API或语言结构进行定制
- 特别适合JavaScript等脚本语言的模糊测试
2. 核心概念与工作原理
2.1 语法文件结构
Dharma语法文件由三个主要部分组成:
- 值(Values)部分:定义基本的字符串和数值常量
- 变量(Variables)部分:定义可变的元素和占位符
- 方差(Variance)部分:定义如何组合和变异测试用例
2.2 模糊测试流程
- 定义目标API或语言结构的语法模板
- Dharma根据模板生成大量变体
- 将生成的测试用例嵌入到目标载体(如PDF)
- 使用目标程序(如Foxit Reader)执行测试用例
- 监控程序行为,捕获崩溃或异常
3. 实战案例:Foxit Reader JavaScript引擎模糊测试
3.1 目标分析
案例中针对Foxit Reader的JavaScript引擎进行模糊测试,特别是addField()方法:
var foo = this.addField(cName, cFieldType, nPageNum, oCoords);
参数说明:
cName: 字段名称cFieldType: 字段类型nPageNum: 页码oCoords: 坐标对象
3.2 基础语法模板构建
// 值部分
<value string="this.addField(">
<value string=");">
// 变量部分
<variable name="fieldName">
<value string="'fuzz'">
</variable>
<variable name="fieldType">
<value string="'text'">
<value string="'button'">
<value string="'radio'">
</variable>
// 方差部分
<variance>
<template>%string% %fieldName%, %fieldType%, 0, [0,0,100,100]%string%</template>
</variance>
3.3 增强语法模板
添加try/catch块和属性设置:
<value string="try {">
<value string="var f = ">
<value string="f.display = display;">
<value string="} catch(e) {}">
<variable name="display">
<value string="visible">
<value string="hidden">
<value string="noPrint">
</variable>
<variance>
<template>%string% %string% %string% %string% %string% %string% %string% %string%</template>
</variance>
3.4 完整语法模板示例
<value string="this.addField(">
<value string=");">
<value string="try {">
<value string="var f = ">
<value string="f.display = display;">
<value string="} catch(e) {}">
<variable name="fieldName">
<value string="'fuzz'">
<value string="'test'">
<value string="'a'">
</variable>
<variable name="fieldType">
<value string="'text'">
<value string="'button'">
<value string="'radio'">
</variable>
<variable name="display">
<value string="visible">
<value string="hidden">
<value string="noPrint">
</variable>
<variance>
<template>%string% %string% %fieldName%, %fieldType%, 0, [0,0,100,100]%string% %string% %string% %string% %string% %string% %string%</template>
</variance>
4. Dharma命令行使用
基本命令格式:
dharma -grammars <语法文件> -output <输出目录>
常用参数:
-grammars: 指定语法文件-output: 指定输出目录-count: 生成测试用例的数量-seed: 设置随机种子
5. 测试用例部署与执行
-
生成JavaScript测试用例:
dharma -grammars foxit_js.grammar -output testcases -
嵌入PDF文档:
- 使用Didier Stevens的PDF工具包
- 将生成的JavaScript嵌入PDF文档中
-
执行测试:
- 使用Foxit Reader打开生成的PDF
- 监控程序行为,捕获崩溃
6. 崩溃分析与利用
案例中发现的漏洞模式:
- 通过getter回调触发对象释放
- 在对象释放后仍然被引用
- 导致释放后使用(Use-After-Free)漏洞
- 最终可能实现远程代码执行
典型崩溃特征:
EBX引用了放入EAX的释放堆对象
EAX立即用于执行调用指令
7. 高级技巧与最佳实践
-
API研究:
- 仔细研究目标程序的API文档
- 重点关注可能操作内存或资源的API
-
语法设计:
- 从简单模板开始,逐步增加复杂性
- 包含异常处理(try/catch)以提高测试稳定性
- 设计多种参数组合和边界条件
-
测试优化:
- 优先测试可能引发内存操作的API
- 包含对象生命周期操作(创建、使用、释放)
- 测试属性访问器和回调函数
-
结果分析:
- 最小化崩溃测试用例
- 分析崩溃上下文和内存状态
- 确定漏洞可利用性
8. 扩展应用
Dharma不仅限于JavaScript模糊测试,还可用于:
- PDF对象结构模糊测试
- 字体解析器测试
- 图像解码器测试
- 其他脚本引擎测试(VBScript, ActionScript等)
9. 相关资源
- Dharma项目地址
- Didier Stevens的PDF工具包
- Foxit Reader API文档
- ZDI漏洞公告示例:
- ZDI-18-1157
- ZDI-18-1183
- ZDI-18-1162
- ZDI-18-1208
10. 总结
Dharma是一个强大的基于语法的模糊测试工具,特别适合针对特定API或语言结构进行有针对性的测试。通过精心设计语法模板,可以有效发现目标程序中的内存破坏漏洞和其他异常行为。本教学文档提供了从基础到实践的完整指导,帮助安全研究人员快速上手并有效使用Dharma进行模糊测试。