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
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课