简介
Mp3-Nator 2.0 是一款简单的 mp3 播放器。通过对该款软件的调试,本人发现这款播放
器存在缓冲区溢出的漏洞,测试的平台是在 windows xp sp3(英文版)。而本文的主要目的
不是描述这款软件的漏洞,而是分享了本人在拿到这个软件之后挖掘这个软件漏洞的过程并
且利用漏洞的方式。
初步测试
在学习了很多播放器漏洞的文章之后,我们可以总结出:一般播放器的缓冲区漏洞都发
生在对播放列表的解析上。所以我们首先加载歌曲 music1 和music2,通过保存一个正常的播
放器列表,将生成的 normal.plf用 winhex 来查看在正常情况下的播放器列表结构。

从上图我们可以得出:歌曲文件路径使用“0D 0A”(回车换行)这样的字符进行分割
的,那么我们可以设想,如果我们构造一个文件的路径很长的.plf格式的文件,会不会导致
缓冲区溢出呢?
于是我生成一个 5000 字节全“A”的名为 test.plf的文件,播放器在加载这个文件之后
立即退出了。我们用调试器 attach到播放器进程,让播放器加载 test.plf,软件异常:

图 2 显示了软件出现异常时调试器停在了 0x00403C64,:
00403C64 $ 8B10 MOV EDX,DWORD PTR DS:[EAX]
由于EAX寄存器被覆盖成了0x41414141导致了访问异常,而观察此时的栈空间的情况,
我们可以发现从 0x12E9C4 的栈地址开始,一直到 0x12FD48 的地址的内容全部被覆盖
成”0x41414141”的值。0x12FD48-0x12E9C4+4=0x1388 (5000),刚好等于我们构造的字符数
目。所以由此可以得出结论:该软件缺乏对输入文件路径长度的限制,导致了该软件存在栈
的缓冲区的溢出漏洞。
深入分析
接下来的工作当然是调试该软件,深入分析该软件产生漏洞的原因,调试的方式还是通
过 attach 的方式。文件的处理过程应该是首先通过 CreateFileA 或 CreateFilwW 获得文件句
柄,之后再通过 ReadFile 将文件内容读入。所以首先对 CreateFileA和CreateFileW下断点,
然后将加载 test.plf 文件,断在系统 CreateFileA函数入口处,此时的栈空间如下:
0012F9A4 00000080 €... |Attributes = NORMAL
0012F9A8 00000000 .... \hTemplateFile = NULL
0012F98C 00408947 G‰@. /CALL to CreateFileA from MP3N.00408942
0012F990 00A777DC |FileName = "C:\Documents and
Settings\xiaot\Desktop\test.plf"
0012F994 80000000 ...€ |Access = GENERIC_READ
0012F998 00000001 ... |ShareMode = FILE_SHARE_READ
0012F99C 00000000 .... |pSecurity = NULL
0012F9A0 00000003 ... |Mode = OPEN_EXISTING
可以看出这是打开 test.plf 文件的句柄操作,用 Ctrl+F9 回到主程序的运行空间,获得的
句柄是 0xA8,之后再对 ReadFile 下断,F9 之后,程序停在 ReadFile 函数入口处,栈空间数
据如下:
0012F980 00408989 ‰‰@. /CALL to ReadFile from MP3N.00408984
0012F984 000000A8 ¨... |hFile = 000000A8 (window)
0012F988 00A78894 ”ˆ§. |Buffer = 00A78894
0012F98C 00001388 ˆ .. |BytesToRead = 1388 (5000.)
0012F990 0012F998 ˜ù . |pBytesRead = 0012F998
0012F994 00000000 .... \pOverlapped = NULL
程序会将文件中的数据拷贝到以 0xA78894 为首地址的缓冲区,读入的数据大小是 5000
字节。之后的程序处理流程就是判断读入的字符数是否为 0,然后通过 0x0A和 0x0D来切割
输入的缓冲区字符,然后通过SendMessageA函数,设置LB_ADDSTRING消息,将读入的缓冲
区发送给播放器窗口的播放列表(listbox控件)。到目前为止程序是没有问题的,但是接下来,
程序会用一个缓冲区去保存播放文件列表中的值,因为程序会根据播放列表中的值即播放文 |