初中生用easyfuzzer 1.5挖掘WINXP播放器内存破坏漏洞

光刃 (用什么头像好呢?) | 2014-11-17 13:40

请在看这篇日志之前,先阅读下面这篇日志

小学生用easyfuzz 1.0 挖掘缓冲区溢出漏洞。

链接:http://www.asm64.com/Study001.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.png

2.png

输入我们的代码,输入后缀名,点击确定来生成畸形样本。

几秒钟的时间,我们已经生成了1万多个畸形样本,下面就需要对这些畸形样本进行fuzz测试了。

(如果你再此之前从来没有用过windows播放器,请先配置一下 否则不能成功挖掘漏洞)

这里修改一下配置信息。

在我的机器上,播放器处理一个样本大约需要2秒,所以我设置成每一个样本运行2秒。(数值设置太小会导致不能成功fuzz)

由于该播放器特殊性,不能进行多线程运行,所以开启速率应该比运行时间略大,我这里设置成2.2秒

3.png

设置完毕后记得点击确定。

由于我们是靠代码生成的样本,因此就不需要模板文件了,如下图。然后点击FUZZING按钮

4.png

为了观察方便,您可以吧总在最前面按钮选上。当然你完全可以不选。

下面就是fuzz测试过程了,这个过程时间较长,您可以去喝一杯咖啡。不过我更喜欢喝苹果汁。

按照我的选项,完全测试完毕需要6个小时,当然你可以多开几个虚拟机用分布式挖掘。在一个i7 pc级cpu中,完全可以开6个虚拟机(需要较大的内存)这样一个小时就足够了。

由于时间原因,我这里提前结束了fuzz。

好消息是,我已经找到畸形样本了。

5.png

这时候我们去看看日志目录。目录在哪里呢?在选项菜单里面。

6.png

日志显示,因为除以0导致了崩溃。 我们下面手动测试下。

找到00000000.mid 和00000043.mid样本。

7.png

8.png

有关该漏洞的详细信息,您可以访问

WooYun: Windows xp sp3   mspaint.exe拒绝服务漏洞

1.5测试版下载地址:

http://www.asm64.com/Soft/EasyFuzzer1.5BETA.zip

该版本bug很多,如果你不能容忍,请等待到本周四下载easyfuzzer 1.5正式版