探索黑客技术攻防,实战研究与安全创新

导航菜单

一听音乐盒本地 m3u文件溢出

 “一听音乐盒”是一款可以满足用户在线听歌需要的国产播放器软件,它有一个庞大的曲库作为支持。从官方的宣传资料来看,“一听音乐盒”集搜索、在线试听、歌曲管理、歌词匹配等众多功能于一身,永久免费且无需注册。如此强大的软件势必会吸引网络用户的大量使用,在自己安装了该软件之后,出于好奇,我将该软件放入到了自己开发的安全测试系统中,系统给出了一些安全警告提示,其中的一个安全警告是关于 m3u文件的。众所周知,m3u文件是音乐播放软件最常用的一种用来存放音乐文件列表信息的文件格式。它是采用明文的形式来存放用户播放过的音乐文件信息,基本格式大致如下:音乐文件路径|音乐文件属性 1|音乐文件属性 2|音乐文件属性  3这里的“音乐文件属性”一般包含音乐文件的作者、音乐文件压缩比等等信息。m3u文件最为关键的一个地方是存放音乐文件路径的地方,由于 Windows系统下对任何文件的路径长度规定在   260个字节以内,但是,第三方软件的开发者往往不注意这个细节,而是自来规定文件路径长度,这就导致会发生一些严重的安全漏洞,最为常见的安全漏洞就是缓冲区溢出漏洞。在对“一听音乐盒”这款软件进行安全测试的时候,我们就发现了这样一个典型的溢出漏洞。<

这里首先给大家介绍一下本次漏洞挖掘的测试环境,电脑系统采用的是 Windows XP SP3,被测试软件为“一听音乐盒”,版本号为:2.1.0.4。在当前系统中安装好“一听音乐盒”软件后,我们初步运行一下“一听音乐盒”,界面如图 1所示。

QQ截图20160908151536.png

由于我这里没有连接互联网,所以大家看到图 1右侧的位置显示的内容为无法连接到网页。初次运行“一听音乐盒”后,我发现该软件会在自己的安装目录下产生一些文件,如图 2所示。

QQ截图20160908151639.png

家注意看此刻,图 2中出现了很多   m3u格式的文件,这些文件的作用其实就是用来记录用户当前操作“一听音乐盒”时,“一听音乐盒”操作过的音乐文件信息。我们这里选择对 broadcast.m3u文件进行一次安全测试,我们在其中输入了这样的内容:

C:\Documents  and  Settings\All  Users\Documents\My  Music\示例音乐

\Beehhoven(这里是超长的        Beehhoven) .wma|Symphony   No.   9

(Scherzo)|Ludwig van  Beehhoven, composer.  Seattle Symphony.  Gerard

Schwarz, director||||75|0


我们此刻修改 broadcast.m3u文件中的音乐路径为一个超长的文件名,目的就是想要测试一下“一听音乐盒”在处理这样畸形的  m3u文件时会不会发生溢出漏洞。

修改并保存好 broadcast.m3u文件后,再次运行“一听音乐盒”,我们发现“一听音乐盒”竟然没有任何变化,一切正常!难道说,我们的测试失败了,“一听音乐盒”对 m3u文件的内容有着严格的安全防范吗?先不要急着下结论,此刻,我们在“一听音乐盒”中间显示音乐文件名称的地方右击鼠标出现一个菜单,如图 3所示。

QQ截图20160908151739.png

在图 3显示的菜单中,我们选择“浏览文件”,你会发现当你刚点击完“浏览文件”菜单后,“一听音乐盒”的界面瞬间消失了。刚开始我还以为是“一听音乐盒”最小化了,结果却发现“一听音乐盒”是完全崩溃了。不信,我们现在利用 OllyDbg程序来再次运行“一听音乐盒”,然后重复刚才的操作,你会发现 OllyDbg程序监视到“一听音乐盒”发生了严重的运行错误,如图 4所示。

QQ截图20160908151807.png

大家此刻注意,现在“一听音乐盒”发生错误时的指令为“CALLDWORD PTR DS:[ECX+14]”。这个指令非常有意思,这暗示着如果我们能够控制 ECX的内容,就能够控制“一听音乐盒”执行任意指令,这样一来一个严重的安全漏洞就被我们发现了。

不要关闭 OllyDbg,我们从图 4显示的地方向上看一看出错前的代码指令。

00422653

00422655

00422656

0042265C

0042265D

0042265E

8B08

MOV ECX,DWORD PTR DS:[EAX]

PUSH ESI

56

8D95 ECFDFFFF

LEA EDX,DWORD PTR SS:[EBP-214]

PUSH EDX

52

50

PUSH EAX

FF51 14

CALL DWORD PTR DS:[ECX+14]


在  OllyDbg程序监视到“一听音乐盒”发生运行错误时,ECX寄存器的值其实是来自于 EAX寄存器,上述代码中第一行指令:MOVECX,DWORD  PTR  DS:[EAX],意思就是从 EAX寄存器指向的内存中取出数据并赋值给 ECX寄存器。我们再回过头看一看图  4中右侧显示的  EAX寄存器的数值为00680068。这个数值很是让人怀疑,“00680068”不久刚好是两个字母 h的  Unicode表达式。这是不是意味着 EAX寄存器的值就来源于我们前面在 broadcast.m3u文件中输入的“Beehhoven”单词中的两个“hh”?

为了证明我们的猜想,我们关闭   OllyDbg,修改  broadcast.m3u文件中的内容,将“Beehhoven”单词中的两个“h”替换为“gg”,再次保存 broadcast.m3u文件。运行   OllyDbg程序,用它来打开“一听音乐盒”,重复上面的操作,此刻我们来看一看出错时的 EAX寄存器的数值,如图 5所示。

QQ截图20160908151920.png

注意看图5右侧上方显示的EAX寄存器数值,此刻变为了“00670067”,这正好就是“gg”的  Unicode表达式。为此,我们证明了  broadcast.m3u中过长的音乐文件名称确实可以覆盖到“一听音乐盒”的 EAX寄存器,通过控制  EAX寄存器的内容,我们最终可以让“一听音乐盒”在发生错误的时候执行到我们想要的内存地址上。

而且,我们通过图 5可以看出,在“一听音乐盒”发生错误的时候,EBP寄存器指向的内容正好就是   broadcast.m3u中过长的音乐文件名称的一部分,为此,我们就可以控制“一听音乐盒”在出错时直接跳转到 EBP寄存器指向的内存地址上去执行  Shellcode,当然,此刻的Shellcode要符合  Unicode编码,这一点可以参考网络上的一些文章。

可以说“一听音乐盒”的这个溢出漏洞是一个非常典型的安全漏洞,它不同于以往的缓冲区溢出漏洞,它造成的结果是覆盖了某一个关键的寄存器数据,造成了指针覆盖式的安全漏洞,总体来说还是属于溢出类型的。这里最需要大家学习的就是在对软件进行安全测试时,一定要详细,不要断然下结论,很多漏洞都隐藏得很深。本文为网络安全技术研究记录,文中技术研究环境为本地搭建或经过目标主体授权测试研究,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,在挖掘、提交相关漏洞的过程中,应严格遵守相关法律法规。

<