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

  • A+
所属分类:逆向工程

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

小学生用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)是不解析的,些什么都一样 

第四行和第五行类似于第三行 

第六行类似与第一行 

第七行:取第八行代码生成数据的大小, 

第八行:字符串类型,需要变异。表示轨道块。 

 

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

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

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



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

这里修改一下配置信息。 

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

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

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

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

由于我们是靠代码生成的样本,因此就不需要模板文件了,如下图。然后点击FUZZING按钮 
初中生用easyfuzzer 1.5挖掘WINXP播放器内存破坏漏洞 

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

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

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

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

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

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

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

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

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

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


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

初中生用easyfuzzer 1.5挖掘WINXP播放器内存破坏漏洞 
有关该漏洞的详细信息,您可以访问 

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



1.5测试版下载地址: 

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



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

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: