通过源码学习peach的使用
字数 2977 2025-08-29 22:41:24

Peach模糊测试工具使用指南

1. Peach简介

Peach是一个功能强大的模糊测试框架,支持多种版本:

  • Peach2:使用Python2编写,环境搭建困难且文档较少
  • Peach3Peach4:使用C#编写,本文主要分析Peach4

2. 环境搭建

2.1 准备工作

  1. 安装TypeScript 1.8以下版本:
    npm install -g typescript@1.8
    
  2. 安装Ruby 3.4,但环境变量指向Ruby2.7/bin目录
  3. 使用管理员权限安装:
    • Java
    • xsltprocs
    • git
  4. 安装最新版doxygen
  5. 安装Visual C++ Redistributable for Visual Studio 2012 Update 4

2.2 编译环境

  1. 使用命令生成sln文件:
    waf.bat msvs2017
    
  2. 将启动项目设为peach
  3. 为peach项目指定pit文件作为命令行参数

3. PIT文件基础

PIT文件是XML格式的配置文件,包含三个基本元素:

  1. DataModel:定义协议格式
  2. StateModel:定义协议状态机
  3. Test:指定运行时配置

3.1 DataModel通用参数

  • name:元素标识
  • mutable:是否变异(默认true)
  • occur相关参数:
    • minOccurs:最少出现次数(默认1)
    • maxOccurs:最多出现次数(默认1)
    • occurs:实际出现次数(默认1)

4. DataModel元素类型

4.1 Block

  • 用于统一操作多个元素
  • 关键参数:
    • ref:引用其他Block或DataModel

4.2 Number

  • 定义整数(字节码数据)
  • 关键参数:
    • size:bit为单位(最大64)
    • signed:是否有符号(默认false)
    • endian:大小端(默认小端)
    • value:默认值
    • valueType:值格式(string或hex,默认string)

4.3 Double

  • 定义浮点数
  • 关键参数:
    • size:32或64 bit
    • signed:是否有符号
    • endian:大小端
    • value:默认值(支持科学计数法)
    • valueType:值格式

4.4 Blob

  • 定义数据块
  • 关键参数:
    • length:长度
    • lengthType:bytes或bits(默认bytes)
    • value:默认值
    • valueType:值格式
    • token:是否为token(默认false)

4.5 Choice

  • 包含多个子元素
  • 变异时从子元素中选择一个
  • 建议将子元素的mutable设为false

4.6 Flag

  • 本质上是Number
  • 通过Flags包裹可支持数组相关变异策略

4.7 Padding

  • 填充数据包
  • 关键参数:
    • alignment:对齐bit数(默认8)
    • alignedTo:指定对齐元素
    • minSize:最少填充bit数(默认0)

4.8 String

  • 定义字符串
  • 关键参数:
    • length:长度
    • lengthType:bytes、bits或chars(默认bytes)
    • nullTerminated:是否以00结尾(默认false)
    • padCharacter:填充字符
    • type:编码类型(默认utf8)
    • value:默认值
    • valueType:值格式

5. Relation元素

用于统计其他字段信息:

5.1 长度计算

<Relation type="size" of="元素名"/>

5.2 表达式运算

<Relation type="size" of="元素名" 
          expressionSet="size*2" 
          expressionGet="size/2"/>

5.3 重复次数计算

<Relation type="count" of="元素名"/>

5.4 偏移计算

  1. 相对于数据包头部:
    <Relation type="offset" of="元素名"/>
    
  2. 相对于Relation所在元素:
    <Relation type="offset" of="元素名" relative="true"/>
    
  3. 相对于指定元素:
    <Relation type="offset" of="元素名" from="参考元素"/>
    

6. Fixup功能

6.1 校验和计算

<Fixup class="Checksum">
  <Param name="ref" value="待校验元素"/>
  <Param name="type" value="算法类型"/>
</Fixup>

6.2 自定义校验和(Python)

  1. 编写Python模块:
    class MyChecksum:
        def __init__(self):
            pass
    
        def fixup(self, data):
            # 处理C#类型数据,返回整型
            return checksum
    
  2. 导入模块:
    <Import import="文件名"/>
    
  3. 绑定元素:
    <Fixup class="ScriptFixup">
      <Param name="class" value="文件名.类名"/>
      <Param name="ref" value="元素名"/>
    </Fixup>
    

6.3 Hash计算

<Fixup class="Hash">
  <Param name="ref" value="元素名"/>
  <Param name="type" value="算法类型"/>
</Fixup>

6.4 序列号生成

  1. 递增序列号:
    <Fixup class="Sequence">
      <Param name="ref" value="元素名"/>
      <Param name="type" value="increment"/>
    </Fixup>
    
  2. 随机序列号:
    <Fixup class="Sequence">
      <Param name="ref" value="元素名"/>
      <Param name="type" value="random"/>
    </Fixup>
    

6.5 值拷贝

<Fixup class="CopyValue">
  <Param name="ref" value="源元素"/>
  <Param name="from" value="目标元素"/>
</Fixup>

7. Transformer

对元素进行编码:

<Transformer class="编码类型">
  <Param name="ref" value="元素名"/>
</Transformer>

8. Hint

为字段添加特定变异器:

<Hint name="NumericalString"/>
<Hint name="TypeTransform"/>

9. 变异器(Mutator)

9.1 状态变异器(StateMutator)

  1. ActionDuplicate
  2. ActionRemove
  3. ActionSwap
  4. StateChangeRandom

9.2 数据变异器(DataMutator)

在Test标签中使用includeexclude选择变异器:

9.2.1 数组相关

  • ArrayEdgeCase:Sequence且元素数量≠0
  • ArrayRandomizeOrder:Sequence且元素数量>1
  • ArrayReverseOrder:Sequence且元素数量>1
  • ArrayVariance:Sequence且元素数量≠0

9.2.2 Blob相关

  • BlobChangeFromNull:Blob且内容不为空
  • BlobChangeRandom:Blob且内容不为空
  • BlobChangeSpecial:Blob且内容不为空
  • BlobChangeToNull:Blob且内容不为空
  • BlobExpandAllRandom:Blob
  • BlobExpandSingleIncrementing:Blob
  • BlobExpandSingleRandom:Blob
  • BlobExpandZero:Blob
  • BlobReduce:Blob且内容不为空

9.2.3 其他重要变异器

  • ChoiceSwitch:Choice且选项>1
  • DataElementBitFlipper:所有元素且内容不为空
  • DataElementDuplicate:非Choice/Flag且内容不为空
  • DataElementRemove:非Choice/Flag且父元素不为空
  • DataElementSwapNear:非Flag且存在下一个元素
  • StringSqlInjection:字符串
  • StringUnicode*:多种Unicode相关变异器

10. 变异策略(Strategy)

10.1 Sequential

  • 对所有mutable=true的元素依次使用所有变异器
  • 每次只变异一个元素

10.2 RandomStrategy

  • 随机选择最多N个元素进行变异(默认N=6)
  • 每个元素随机使用变异器

10.3 RandomDeterministicStrategy

  • 随机使用所有变异器
  • 依次使用变异器返回的结果
  • 每次只变异一个元素

11. 实用技巧

  1. 调试模式:
    peach --debug
    
  2. 指定随机种子:
    peach --seed 123
    
  3. 第一个数据包为原始数据包,不会变异

12. 与Boofuzz对比

特性 Peach Boofuzz
变异器数量 较多 较少
变异策略 Sequential/Random/RandomDeterministic 单一策略
数据定义 XML格式直观 函数调用方式
状态定义 文档较少 直接connect
自定义函数 需C#类型转换 Python原生支持
结果查看 需实时抓包 SQLite数据库+网页查看

13. 总结建议

  1. 单一状态网络模糊测试:建议使用Peach
  2. 多状态或需要自定义函数:建议使用Boofuzz
  3. 文件格式模糊测试:Peach提供更多专用标签
Peach模糊测试工具使用指南 1. Peach简介 Peach是一个功能强大的模糊测试框架,支持多种版本: Peach2 :使用Python2编写,环境搭建困难且文档较少 Peach3 和 Peach4 :使用C#编写,本文主要分析Peach4 2. 环境搭建 2.1 准备工作 安装TypeScript 1.8以下版本: 安装Ruby 3.4,但环境变量指向Ruby2.7/bin目录 使用管理员权限安装: Java xsltprocs git 安装最新版doxygen 安装Visual C++ Redistributable for Visual Studio 2012 Update 4 2.2 编译环境 使用命令生成sln文件: 将启动项目设为peach 为peach项目指定pit文件作为命令行参数 3. PIT文件基础 PIT文件是XML格式的配置文件,包含三个基本元素: DataModel :定义协议格式 StateModel :定义协议状态机 Test :指定运行时配置 3.1 DataModel通用参数 name :元素标识 mutable :是否变异(默认true) occur 相关参数: minOccurs :最少出现次数(默认1) maxOccurs :最多出现次数(默认1) occurs :实际出现次数(默认1) 4. DataModel元素类型 4.1 Block 用于统一操作多个元素 关键参数: ref :引用其他Block或DataModel 4.2 Number 定义整数(字节码数据) 关键参数: size :bit为单位(最大64) signed :是否有符号(默认false) endian :大小端(默认小端) value :默认值 valueType :值格式(string或hex,默认string) 4.3 Double 定义浮点数 关键参数: size :32或64 bit signed :是否有符号 endian :大小端 value :默认值(支持科学计数法) valueType :值格式 4.4 Blob 定义数据块 关键参数: length :长度 lengthType :bytes或bits(默认bytes) value :默认值 valueType :值格式 token :是否为token(默认false) 4.5 Choice 包含多个子元素 变异时从子元素中选择一个 建议将子元素的 mutable 设为false 4.6 Flag 本质上是Number 通过Flags包裹可支持数组相关变异策略 4.7 Padding 填充数据包 关键参数: alignment :对齐bit数(默认8) alignedTo :指定对齐元素 minSize :最少填充bit数(默认0) 4.8 String 定义字符串 关键参数: length :长度 lengthType :bytes、bits或chars(默认bytes) nullTerminated :是否以00结尾(默认false) padCharacter :填充字符 type :编码类型(默认utf8) value :默认值 valueType :值格式 5. Relation元素 用于统计其他字段信息: 5.1 长度计算 5.2 表达式运算 5.3 重复次数计算 5.4 偏移计算 相对于数据包头部: 相对于Relation所在元素: 相对于指定元素: 6. Fixup功能 6.1 校验和计算 6.2 自定义校验和(Python) 编写Python模块: 导入模块: 绑定元素: 6.3 Hash计算 6.4 序列号生成 递增序列号: 随机序列号: 6.5 值拷贝 7. Transformer 对元素进行编码: 8. Hint 为字段添加特定变异器: 9. 变异器(Mutator) 9.1 状态变异器(StateMutator) ActionDuplicate ActionRemove ActionSwap StateChangeRandom 9.2 数据变异器(DataMutator) 在Test标签中使用 include 和 exclude 选择变异器: 9.2.1 数组相关 ArrayEdgeCase:Sequence且元素数量≠0 ArrayRandomizeOrder:Sequence且元素数量>1 ArrayReverseOrder:Sequence且元素数量>1 ArrayVariance:Sequence且元素数量≠0 9.2.2 Blob相关 BlobChangeFromNull:Blob且内容不为空 BlobChangeRandom:Blob且内容不为空 BlobChangeSpecial:Blob且内容不为空 BlobChangeToNull:Blob且内容不为空 BlobExpandAllRandom:Blob BlobExpandSingleIncrementing:Blob BlobExpandSingleRandom:Blob BlobExpandZero:Blob BlobReduce:Blob且内容不为空 9.2.3 其他重要变异器 ChoiceSwitch:Choice且选项>1 DataElementBitFlipper:所有元素且内容不为空 DataElementDuplicate:非Choice/Flag且内容不为空 DataElementRemove:非Choice/Flag且父元素不为空 DataElementSwapNear:非Flag且存在下一个元素 StringSqlInjection:字符串 StringUnicode* :多种Unicode相关变异器 10. 变异策略(Strategy) 10.1 Sequential 对所有 mutable=true 的元素依次使用所有变异器 每次只变异一个元素 10.2 RandomStrategy 随机选择最多N个元素进行变异(默认N=6) 每个元素随机使用变异器 10.3 RandomDeterministicStrategy 随机使用所有变异器 依次使用变异器返回的结果 每次只变异一个元素 11. 实用技巧 调试模式: 指定随机种子: 第一个数据包为原始数据包,不会变异 12. 与Boofuzz对比 | 特性 | Peach | Boofuzz | |------|-------|---------| | 变异器数量 | 较多 | 较少 | | 变异策略 | Sequential/Random/RandomDeterministic | 单一策略 | | 数据定义 | XML格式直观 | 函数调用方式 | | 状态定义 | 文档较少 | 直接connect | | 自定义函数 | 需C#类型转换 | Python原生支持 | | 结果查看 | 需实时抓包 | SQLite数据库+网页查看 | 13. 总结建议 单一状态网络模糊测试 :建议使用Peach 多状态或需要自定义函数 :建议使用Boofuzz 文件格式模糊测试 :Peach提供更多专用标签