初中生用easyfuzzer 1.5挖掘WINXP播放器内存破坏漏洞
请在看这篇日志之前,先阅读下面这篇日志
小学生用easyfuzz 1.0 挖掘缓冲区溢出漏洞。
链接:http://www.asm64.com/Study/001.html
Easyfuzzer 1.4开始支持智能fuzz。
详细的使用文档,请浏览网站:http://www.asm64.com/readme/readme.mht
这里我只简单的介绍一下:
到1.5为止,easyfuzzer已经支持4种函数类型。
分别是:
智能fuzz支持的语句简介:
第一种:
_num,参数1,参数2,参数3,参数4;
如:_num,100,1,0,32;
_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,参数1,参数2,参数3 ,参数4, 参数5 ,参数6;
如:_str,helloworld,1,0,0,32,1;
_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表示大尾。
第三种:
_cal,addr,参数1,参数2,参数3
如: _cal,addr,32,0,3
参数1:表示计算结果的位数。 可选值为 8,16,32 分别表示8位,16位,32位。(即1字节 2字节 4字节)
参数2:结果的大小尾, 0表示小尾,1表示大尾。
参数3:计算目标(函数序列号) 上面例子是3,就是计算第三个函数的偏移地址。
第四种:
_cal,size,参数1,参数2,参数3,参数4
如:_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个函数的大小。
注意:开始函数值不应该大于结束函数值
挖掘mid文件格式漏洞
我们的目标是windows xpxp3的媒体播放器
我们这里选择一款简单的文件格式。Mid文件格式。
下面是mid文件格式简介,详细信息请自行百度。
1.mid文件格式简介:
一个MIDI文件基本上由两个部分组成,头块和轨道块。 具体信息请百度。
2.头块:
头块出现在文件的开头,头块看起来一直是这样的:
4D5468640000 0006 ffff nnnn dddd
4D5468640000表示头块的标示值
ffff是文件的格式,有3种格式:
nnnn 是MIDI文件中的轨道数。
dddd 是每个4分音符节奏数
3.轨道块:
4D54726B xxxxxxxx aaaaaaaaaaaaaaaa
4D54726B 表示轨道块的表示值
aaaaaaaa表示轨道块
xxxxxxxx表示轨道块的大小
我认为:除了头块和轨道块的标示值以外,所有的结构都应该作为fuzz的结构,当然您可以有自己的思路。
下面是我根据我对mid文件结构的了解,编写的一段代码:
_str,MThd,1,6,0,0,0;
_cal,size,16,1,1,1;
_num,ffffh,0,0,16;
_num,ffffh,0,0,16;
_num,ffffh,0,0,16;
_str,MTrk,1,4,0,0,0;
_cal,size,16,1,8,8;
_str,fffffffffffffffffff,0,0,0,0,0;
第一行代码:头信息为MThd,长度为6的字符串类型
第二行代码:第一行代码解析字符串的长度,要求大尾形式。并且大小是16位
第三行代码:一个16位的数据,数据需要fuzz。
该数值为变异数值,所以第一个参数(FFFFH)是不解析的,些什么都一样
第四行和第五行类似于第三行
第六行类似与第一行
第七行:取第八行代码生成数据的大小,
第八行:字符串类型,需要变异。表示轨道块。
输入我们的代码,输入后缀名,点击确定来生成畸形样本。
几秒钟的时间,我们已经生成了1万多个畸形样本,下面就需要对这些畸形样本进行fuzz测试了。
(如果你再此之前从来没有用过windows播放器,请先配置一下 否则不能成功挖掘漏洞)
这里修改一下配置信息。
在我的机器上,播放器处理一个样本大约需要2秒,所以我设置成每一个样本运行2秒。(数值设置太小会导致不能成功fuzz)
由于该播放器特殊性,不能进行多线程运行,所以开启速率应该比运行时间略大,我这里设置成2.2秒
设置完毕后记得点击确定。
由于我们是靠代码生成的样本,因此就不需要模板文件了,如下图。然后点击FUZZING按钮。
为了观察方便,您可以吧总在最前面按钮选上。当然你完全可以不选。
下面就是fuzz测试过程了,这个过程时间较长,您可以去喝一杯咖啡。不过我更喜欢喝苹果汁。
按照我的选项,完全测试完毕需要6个小时,当然你可以多开几个虚拟机用分布式挖掘。在一个i7 pc级cpu中,完全可以开6个虚拟机(需要较大的内存)这样一个小时就足够了。
由于时间原因,我这里提前结束了fuzz。
好消息是,我已经找到畸形样本了。
这时候我们去看看日志目录。目录在哪里呢?在选项菜单里面。
日志显示,因为除以0导致了崩溃。 我们下面手动测试下。
找到00000000.mid 和00000043.mid样本。
我们od来验证下,是不是因为除以0导致的崩溃。
有关该漏洞的详细信息,您可以访问
http://www.wooyun.org/bugs/wooyun-2010-060863
1.5测试版下载地址:
http://www.asm64.com/Soft/EasyFuzzer1.5BETA.zip