用DHARMA实现FUZZ LOGICS
字数 1537 2025-08-06 08:35:35

使用DHARMA实现模糊逻辑测试 - 详细教学指南

1. Dharma简介

Dharma是由Mozilla提供的基于迭代器的语法模糊器,它允许用户通过定义语法文件模板来生成测试用例。主要特点包括:

  • 基于语法的模糊测试
  • 使用迭代器生成变体
  • 可针对特定API或语言结构进行定制
  • 特别适合JavaScript等脚本语言的模糊测试

2. 核心概念与工作原理

2.1 语法文件结构

Dharma语法文件由三个主要部分组成:

  1. 值(Values)部分:定义基本的字符串和数值常量
  2. 变量(Variables)部分:定义可变的元素和占位符
  3. 方差(Variance)部分:定义如何组合和变异测试用例

2.2 模糊测试流程

  1. 定义目标API或语言结构的语法模板
  2. Dharma根据模板生成大量变体
  3. 将生成的测试用例嵌入到目标载体(如PDF)
  4. 使用目标程序(如Foxit Reader)执行测试用例
  5. 监控程序行为,捕获崩溃或异常

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. 测试用例部署与执行

  1. 生成JavaScript测试用例

    dharma -grammars foxit_js.grammar -output testcases
    
  2. 嵌入PDF文档

    • 使用Didier Stevens的PDF工具包
    • 将生成的JavaScript嵌入PDF文档中
  3. 执行测试

    • 使用Foxit Reader打开生成的PDF
    • 监控程序行为,捕获崩溃

6. 崩溃分析与利用

案例中发现的漏洞模式:

  1. 通过getter回调触发对象释放
  2. 在对象释放后仍然被引用
  3. 导致释放后使用(Use-After-Free)漏洞
  4. 最终可能实现远程代码执行

典型崩溃特征:

EBX引用了放入EAX的释放堆对象
EAX立即用于执行调用指令

7. 高级技巧与最佳实践

  1. API研究

    • 仔细研究目标程序的API文档
    • 重点关注可能操作内存或资源的API
  2. 语法设计

    • 从简单模板开始,逐步增加复杂性
    • 包含异常处理(try/catch)以提高测试稳定性
    • 设计多种参数组合和边界条件
  3. 测试优化

    • 优先测试可能引发内存操作的API
    • 包含对象生命周期操作(创建、使用、释放)
    • 测试属性访问器和回调函数
  4. 结果分析

    • 最小化崩溃测试用例
    • 分析崩溃上下文和内存状态
    • 确定漏洞可利用性

8. 扩展应用

Dharma不仅限于JavaScript模糊测试,还可用于:

  • PDF对象结构模糊测试
  • 字体解析器测试
  • 图像解码器测试
  • 其他脚本引擎测试(VBScript, ActionScript等)

9. 相关资源

  1. Dharma项目地址
  2. Didier Stevens的PDF工具包
  3. Foxit Reader API文档
  4. ZDI漏洞公告示例:
    • ZDI-18-1157
    • ZDI-18-1183
    • ZDI-18-1162
    • ZDI-18-1208

10. 总结

Dharma是一个强大的基于语法的模糊测试工具,特别适合针对特定API或语言结构进行有针对性的测试。通过精心设计语法模板,可以有效发现目标程序中的内存破坏漏洞和其他异常行为。本教学文档提供了从基础到实践的完整指导,帮助安全研究人员快速上手并有效使用Dharma进行模糊测试。

使用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() 方法: 参数说明: cName : 字段名称 cFieldType : 字段类型 nPageNum : 页码 oCoords : 坐标对象 3.2 基础语法模板构建 3.3 增强语法模板 添加try/catch块和属性设置: 3.4 完整语法模板示例 4. Dharma命令行使用 基本命令格式: 常用参数: -grammars : 指定语法文件 -output : 指定输出目录 -count : 生成测试用例的数量 -seed : 设置随机种子 5. 测试用例部署与执行 生成JavaScript测试用例 : 嵌入PDF文档 : 使用Didier Stevens的PDF工具包 将生成的JavaScript嵌入PDF文档中 执行测试 : 使用Foxit Reader打开生成的PDF 监控程序行为,捕获崩溃 6. 崩溃分析与利用 案例中发现的漏洞模式: 通过getter回调触发对象释放 在对象释放后仍然被引用 导致释放后使用(Use-After-Free)漏洞 最终可能实现远程代码执行 典型崩溃特征: 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进行模糊测试。