EasyFuzzer使用说明

EasyFuzzer简介：
EasyFuzzer是一款新的模糊测试工具。目前只支持文件格式的模糊测试。他可用来挖掘各种文件处理类程序的安全漏洞。其中包括但不局限于：各种播放器，图片浏览器，文档处理工具，等等。

比起其他的fuzzer工具，它特点是：容易，精简，高效，灵活。
容易：非常容易上手，不需要什么配置，非常容易上手。有了他小学生也可以挖漏洞了，再也不愁没有0day了。如果您是软件测试人员，也可以在几分钟内学会该软件的使用。挖出同事不能发现的漏洞，让同事对您刮目相看。
精简：为了容量和速度，软件采用100%汇编语言编写。排除了以往fuzzer的无用功能。绿色软件，无毒无害。
高效：由于采用汇编语言编写，并且支持多线程fuzz和分布式fuzz，因此速度极快，效率极高。或许他也是如今速度最快的模糊测试工具。

灵活：大家在用其他工具fuzz时候，经常会把一些正常的某些行为报成异常行为，原因是一些非异常的“异常”被fuzzer捕捉到了。EasyFuzzer具有忽略异常调试功能，这样大大降低了 fuzzing时的误报率。

程序使用步骤：

配置环境：为了软件能够正常高效运行，您应该准备一个虚拟机（VMWARE)，虚拟机内安装32位的 windows XP SP3。（本软件不支持64位WIN7 至于32位win7是否支持，我还没有测试过）如果您的计算机配置较高，可以安装多个虚拟机，不同的虚拟机分别安装Easyfuzzer程序，这样就可以分布式挖掘，提高挖掘效率。

安装： 改程序为绿色版本，因此无需安装，下载后即可使用。

您可以在官网

http://www.asm64.com

或者去百度软件平台http://rj.baidu.com/soft/detail/36804.html

下载最新版本。当您在使用过程中遇到什么问题，可以加入官方QQ交流群904398739904进行交流。

软件功能介绍（用1.3版本为例）：

模板文件（样本）：随便找一个我们要去搞的样本就可以了。为了覆盖面和效率，样本包含的结构应该尽量多，而样本的容量应该尽量小。

宿主程序路径：要测试程序的路径。

宿主程序路径后面的空格，表示程序运行的参数，一般情况下为空即可。

什么是样本呢？就是我们要去挖掘的文件格式的样本。比如我们要挖掘某播放器处理MP3格式的安全问题，那么样本选取一个正常的MP3文件就可以了，宿主程序就是这个播放器的路径了。

目标路径：生成的畸形样本存放路径。

.后缀名：修改成我们要测试程序的后缀名。

引擎1：用于挖掘整数溢出的引擎。生成样本数据较大，建议在fuzz时候勾选上挖掘范围。一般情况下，范围定位文件头效率较高（如0-128  0-256）

引擎2：挖掘堆栈缓冲区溢出漏洞的引擎。后面x2 x4 x16表示生成的数据量 可表示1-128倍的生成数据， 单倍数据量约为2000个。

引擎2要求样本大小为 256B-1MB

倍数 样本要求最小字节数 推荐样本字节数

1  256 2K-4k

2 512 4K-8k

4  1K 8k-16k

8  2K 16k-32k

16 4K 32K-64K

32 8K 64K-128K

64 16K 128K-256K

128 32K 256K-1MB

总在最前面：在fuzz测试时候，测试程序窗口总会跳到easyfuzzer前面，影响我们观察测试进度，只要勾选这个选项，就可以方便查看easyfuzzer的窗口信息了。

运行时间和开启速率：根据您的机器配置和要挖掘程序的开启速度，来调节这2个数值。合理的数值能让程序高效的运行。如果数值设置的过大，则让模糊测试的效率变低。浪费不必要的电能和时间。如果设置的数值过小，则测试无法成功执行。

运行时间：表示每一个程序运行后的监控时间。如图为2秒，表示一个程序运行后如果2秒后没有任何异常，那就代表他没有异常了。可以关闭该进程了。这个时间应该大于程序启动的时间，为了效率，它应该尽可能小。

开启速率：表示程序每多少时间开启一个新进程。如图所示，0.5秒开启一个新进程。 根据此图的表示。2/0.5=4. 也就是说这个配置相当于四线程进行挖掘。

机器较差的应该把时间调节的长一些，以让程序正常运行。、

异常日志有效路径：这里存放fuzz异常的日志。当软件发现某一个样本让程序发生异常了，会把该样本信息保存在这个文件路径中，方便我们查看分析。

FUZZ完毕自动关机：勾选此项，fuzz完毕后程序会自动关机，从而节约能源。

忽略以下异常：当EASYFUZZER获取的异常不是我们想要的异常时，我们可以把这个异常忽略掉，从而提高fuzz测试效率。

开启自定义样本：一次没fuzz完毕第二次向继续fuzz怎么办？想用easyfuzzer挖掘第三方程序生成的样本怎么办？这个功能解决了这个问题。只要填写样本总数和样本开始ID数，并且把样本遵守我们EASYFUZZER生成的格式规则。即可用easyfuzzer来挖掘第三方程序生成的或者我们上次没有挖掘完毕的样本。

开启分布式挖掘：对于多台虚拟机，如何提高挖掘效率呢？

分布式挖掘提供了这个功能。

比如我们电脑安装了5台虚拟机。我们5个机器同时挖掘，时间就能缩短为五分之一。 如何配置呢？机器总数都设置为5，机器编号 五台机器分别设置为1,2,3,4,5.即可。

样本建议放在实体机的硬盘上。开启相关目录让五台虚拟机共享该目录即可。

漏洞挖掘过程：

1 配置信息

2 生成样本

3 FUZZING

漏洞挖掘需要注意的事项：

1 最好虚拟机要断网，一些程序（如播放器等）发现异常后会自动上传异常样本（我们辛辛苦苦挖掘的poc不能这样就丢掉吧？）

还有一些安全程序。。。这里不多说了。

2 互联网传输的时候一定要对文件进行加密。

智能FUZZ使用说明

EasyFuzzer 从1.4版本开始，支持智能fuzz。

EasyFuzzer 预计将于下周四发布。

智能FUZZ和通用型FUZZ的区别

前面的fuzz是通用型FUZZ，在通用型FUZZ中，我们不需要对文件格式做深入了解就可以上手。比较省时省力。适合一些小型程序或者自定义文件格式。因为他们的防护比较弱。

通用型FUZZ优点是节省时间和简单，容易上手。但是对于越来越多的复杂文件格式而言，通用型FUZZ就无能为力了。因为复杂文件格式有大量的校验，结构数据检查等等，通用型的FUZZ生成的畸形样本中很难达到程序逻辑的更深层。这时候，智能FUZZ出来了。

智能fuzz做法如下：

1 学习相应文件的文件格式。

2 把文件格式写成代码，根据代码，智能fuzzer来生成符合代码约束的畸形样本。

3 把这些样本给程序，让程序去执行。

智能型fuzz和通用型fuzz的最大不同就是有代码约束，这样生成的样本就可以达到逻辑的更深层，在短时间内发现通用型fuzz不可能发现的漏洞。

EASYFUZZER支持的类型和语法规则。

到现在（1.4版本）为止，EASYFUZZER支持2种语法规则。分别是数字类型和字符串类型。下面我们分别介绍着两种类型。

_num,参数1,参数2,参数3,参数4; 如：_num,100,1,0,32;

_str,参数1,参数2,参数3 ,参数4, 参数5 ,参数6;  如:_str,helloworld,1,0,0,32,1;

代码设计规范：

如下图：

一 对于1.4版本 在我们的代码编辑区，一共可以编写256条指令，每一条指令的长度最多是256字节。

二 不同的函数的参数量是不同的，函数以_开始，如现在支持的_num和_str，要求小写。参数之间用“,”表示，要求英文半角字符。每一条指令结尾必须用“;”，仍然是英文半角字符。

三 _num有四个参数：

参数一是数值， 支持10进制类型（如 100,1234567，），也支持16进制类型（如100H，deaddeadh，）16进制字母大小写都可以，后面需要加h来和10进制数据加以区分。

参数二是数据是否可以变异，0为可以变异，1为不可以变异。变异是指以后生成的不同的样本中该数值都会进行变化。如果该数值设置成1（可以变异），那么对于参数一设置成什么值也就都没有什么区别了（参数一部进行解析了）

参数三：大小尾。 0表示小尾（小尾表示低位数据存储在低字节地址上），1表示大尾（大尾表示低位数据存储在高字节地址上）。

比如12345678H  如果是大尾，在内存中是12345678,如果是小尾，在内存中是78563412,

参数四：数值的大小，目前支持8位，16位，32位3种类型。  也就是1字节，2字节，4字节。

8位： 如AAH   16位 如AABBH  32位 如AABBCCDDH

以下表示都是正确的:

_num,11111111h,1,0,32;

_num,2222h,1,0,16;

_num,ffh,1,0,8;

_num,254,1,0,8;

_num,12345678h,1,0,32;

_num,AABBh,1,1,16;

三 _str有六个参数：

_str,helloworld,1,0,0,32,1;

参数一：字符串数值。直接填写数值即可如 helloworld。

参数二：该数值是否变化。0表示变化，1表示不变化。

参数三：字符串的长度，单位为字节。

参数四：字符串类型，0表示STR类型，1表示HEX类型。

如123456，如果是0，输出后内存中的数据是313233343536，如果是1，输出后内存的数据是123456.

参数五：前缀的大小。单位是字节数。有效值为0,8,16,32.

前缀用来表示该字符串的长度。如果您不需要该数值，设置成0就可以。

参数六：前缀的格式， 大尾或者小尾。 0表示小尾，1表示大尾。

EasyFuzz 1.5新增方法

1.5版本 ，支持指令数由1.4的256行提高到4096行。

_cal方法， 目前支持两种。

第一种 _cal,addr,32,0,3

_cal,addr,参数1，参数2，参数3

参数1:表示计算结果的位数。 可选值为 8,16,32   分别表示8位，16位，32位。（即1字节 2字节 4字节）

参数2：结果的大小尾， 0表示小尾，1表示大尾。

参数3：计算目标（函数序列号）  上面例子是3，就是计算第三个函数的偏移地址。

第二种：_cal,size,32,0,4,6

参数1:表示计算结果的位数。 可选值为 8,16,32   分别表示8位，16位，32位。（即1字节 2字节 4字节）

参数2：结果的大小尾， 0表示小尾，1表示大尾。

参数3：开始函数（函数序列号）

参数4：结束函数（函数序列号）

上面的例子，开始是4，结束是6，就是计算4-6 共3个函数的大小。

注意:开始函数值不应该大于结束函数值