BoxSoft WAV to MP3 Converter是一个100%免费功能强大的音频转换工具,可以批量的把WAV格式文件转换成高质量的MP3音频文件,它配备了标准的音频编码器,可以设置比特率和一次转换多个音频文件,另一个方便的特性是可以设置热点目录,在wav转MP3时自动把文件写入该目录进行监视。
漏洞介绍
在用户使用本软件的时候,由于本软件编写过程中缺少对安全性溢出的检测;很容易造成黑客针对此软件编写特定的恶意代码,从而诱导用户打开含有恶意代码的mp3文件,对系统造成破坏,触发CVE-2015-7243漏洞,该漏洞CNNVD编号为CNNVD-201509-374。
在处理wav文件时,遇到头部开始的四字节不等于RIFF,没有结束处理而是继续读取文件寻找RIFF,直到遇到RIFF、读到文件末尾、读取的长度大于等于0×2000,三者其中之一才结束读取,但是处理函数并未分配如此大的空间用于存放读出的内容,所以我们只要构造不含有RIFF的超长字符串就会发生栈溢出,可导致执行任意代码,例如从指定地址下载恶意代码到本地运行。
漏洞等级:严重
poc地址:https://www.exploit-db.com/exploits/38035/
漏洞分析
(1)根据错误信息定位产生异常的代码
使用特定构造的wav文件,产生不可读的异常,载入到OD定位到地址0x004B9C7D处,由于[esi+eax]处所引用的地址不可读导致异常。
使用栈回溯的方式,发现如下代码段修改了那处地址,在此循环中,由于未对循环的长度进行校检导致栈溢出,覆盖了局部变量,使里面保存的地址被替换,引起上面的异常。
(2)使用工具分析此代码的产生异常的原因
使用PEID发现是DELPHI语言写的,因此载入到DEDEDARK,接下来分析此函数,函数开始时先读取wav前4个字节的内容AAAA保存在[esp + c]的位置(esp+c是一个字符数组首地址),之后是一个switch语句,开始时执行case 0。
在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个字节。
(3)漏洞利用
知道了溢出的原理,接下来是利用此漏洞。首先使用覆盖SEH产生异常执行shellcode。寻找最近的SHE,地址为0x0105FEBC,保存文件读出来的内容数组首地址为0x0105EE98,因此先填充0×1024个A,然后填充”\xeb\x06\x90\x90″,接下来填充跳板地址,在xp中有safeSEH保护,则需要在未开启SEH的模块寻找跳板。首先查看本进程未开启SafeSEH的模块,结果只有主模块和msacm32.drv模块。
选取主模块,查找pop pop ret指令,找到的地址为:0x040144c,接下来填充弹出计算器的,之后填充5860个A,用于使栈溢出到不可写的位置,以此来产生异常执行我们的异常函数,运行程序弹出计算器。
EXP如下:
由于本程序没有启用GS,则可以采用覆盖返回地址的方式跳转到shellcode,首先找到保存返回地址的地址:0x0105FEB8,于是填充0×1020个A,查找jmp esp跳板地址充当返回地址执行我们的shellcode,地址为:0x0043F062,接下来填充shellcode,运行程序弹出计算器。
EXP如下:
(1)修改代码,一旦发现标志性字符串不匹配立即结束格式转换,而不是继续读取文件造成缓冲区溢出。
(2)增大保存wav文件内容的局部变量,使缓冲区足以在循环结束前存放格式判断的内容。
总结
在进行漏洞利用时首先需要对导致出现异常的代码进行分析,然后判断漏洞的类型,例如上面的缓冲区溢出漏洞,则可以填充超长字符串来对SEH或者返回地址进行覆盖,在选择跳板时,尽量选择自身模块,这样漏洞利用成功率会提高。
还没有评论,来说两句吧...