小学生用EasyFuzzer挖掘0day漏洞 (WOOYUN)

  • A+
所属分类:WooYun-Zone

光刃 (用什么头像好呢?) 小学生用EasyFuzzer挖掘0day漏洞  (WOOYUN) | 2014-10-16 14:34

扩展阅读;初中生用easyfuzzer1.5挖掘WINXP播放器内存破坏漏洞
http://zone.wooyun.org/content/16593

使用说明:
模板文件:选取正常的文件(在此文件基础上进行变异)
目标路径:存放变异样本的路径。选日志前一定要保证路径存在.
后缀名:填写样本的后缀名
宿主程序:要挖掘软件的路径

挖掘过程:1 进行样本生成
  2 样本生成的文件进行挖掘

小学生用EasyFuzzer挖掘0day漏洞  (WOOYUN)

然后介绍选项窗口
小学生用EasyFuzzer挖掘0day漏洞  (WOOYUN)

选项窗口包括一些高级选项
异常日志:存放异常信息的日志. 选日志前一定要保证路径存在。
运行时间:对每一个样本处理的生命周期。 不同性能的计算机,和不同的测试目标(浏览器,播放器,还是图片查看器) 对这个数值要求是不同的。数值过大会降低实验效率,浪费能源。数值多小则会让测试无法正常进行。
开启速率:多少时间启动一个开启线程。
合理配置好运行时间和开启速率这2个数值,可以大大提高fuzz效率。
如图:运行时间是开启速率的4倍,基本上程序是在四进程上运行。
引擎1: 适合较小文件的漏洞挖掘 主要用于挖掘整数溢出的漏洞。效率较低,覆盖面较广。
引擎2: 用于较大文件的漏洞挖掘(至少大于1KB),主要用于挖掘缓冲区溢出漏洞。
更多引擎正在开发中。
忽略异常这个选项用于异常误报的处理。这里不再讨论。
更多功能正在开发中。下面用他对sdemo视频工具做fuzz。

2.smv是我提前做个一个标准视频样本。
我们选择引擎2 对他生成畸形样本。
点击生成文件。
几秒钟后一句生成完毕
小学生用EasyFuzzer挖掘0day漏洞  (WOOYUN)

打开文件夹,这里已经生成了大量样本。
小学生用EasyFuzzer挖掘0day漏洞  (WOOYUN)

这时候我们点击fuzzing。

小学生用EasyFuzzer挖掘0day漏洞  (WOOYUN)

已经挖掘一部分了,由于时间问题,我提前结束了fuzz

在logo日志内,我们发现了异常日志 某日志现实687号文件出现异常
小学生用EasyFuzzer挖掘0day漏洞  (WOOYUN)
小学生用EasyFuzzer挖掘0day漏洞  (WOOYUN)

手动验证下,确实异常了。
小学生用EasyFuzzer挖掘0day漏洞  (WOOYUN)

其实这就是一个缓冲区溢出漏洞。
这里貌似不能上传附件
软件获取办法:
www.asm64.com

下面为2014,11,10新增内容:
EasyFuzzer 从1.4版本开始,支持智能fuzz。

智能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为不可以变异。变异是指以后生成的不同的样本中该数值都会进行变化。如果该数值设置成0(可以变异),那么对于参数一设置成什么值也就都没有什么区别了(参数一不进行解析了)
参数三:大小尾。 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表示大尾。

对于MID文件格式的结构,我们可以粗略的表示成如下形式
_str,MThd,1,0,0,0,0;
_num,0,1,0,16;
_num,6,1,1,16;
_num,0,0,0,16;
_str,MTrk,1,0,0,0,0;
_str,aaaaaaaaa,0,0,0,32,0;
在后面的版本中,我还会支持更多的类型。
详细文档:http://www.asm64.com/readme/readme.mht

分享到: