首页
社区
课程
招聘
[原创]暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞
发表于: 2009-5-1 17:56 10539

[原创]暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞

2009-5-1 17:56
10539

暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞
by bugvuln(bugvuln_at_gmail.com)
    niklen(niklenxyz_at_gmail.com)

描述:
暴风影音是国内一款相当流行的万能播放器
http://www.baofeng.com/

受影响的系统:
暴风影音2009 <=[3.09.04.17]

细节:
clsid:BD103B2B-30FB-4F1E-8C17-D8F6AADBCC05
C:\Program Files\StormII\Config.dll
Sub SetAttributeValue (
    ByVal lpQueryStr  As String ,
    ByVal bstrAttributeName  As String ,
    ByVal lpValueStr  As String
)

当参数lpQueryStr是一个超长字符串时,发生栈溢出,利用堆填充技术,攻击者可以很轻松的利用此漏洞执行任意代码

分析:
.text:10009A4C                push    ebp
.text:10009A4D                mov    ebp, esp
.text:10009A4F                sub    esp, 208h      ; 开辟208h的堆栈空间
.text:10009A55                cmp    [ebp+Source], 0 ; 判断参数1是否为空
.text:10009A59                jz      short loc_10009AA8
.text:10009A5B                cmp    [ebp+arg_C], 0  ; 判断参数3是否为空
.text:10009A5F                jz      short loc_10009AA8
.text:10009A61                push    [ebp+Source]    ; 参数1
.text:10009A64                lea    eax, [ebp+String]
.text:10009A6A                push    eax            ; eax正好指向ebp-208h的堆栈区域
.text:10009A6B                call    ds:wcscpy      ; oh,my god,不进行参数合法性检查,直接开始拷贝操作,
.text:10009A6B                                        ; 哦豁了,eax指向的堆栈区域全部被超长非法参数占领了-_-!
.text:10009A71                pop    ecx
.text:10009A72                lea    eax, [ebp+String]
.text:10009A78                pop    ecx
.text:10009A79                push    [ebp+arg_8]
.text:10009A7C                push    offset String  ; "/@"
.text:10009A81                push    offset aSS      ; "%s%s"
.text:10009A86                push    eax            ; String
.text:10009A87                call    ds:swprintf    ; 上面的拷贝直接影响到这里的swprintf,相当于再对eax指向的堆栈进行一次拷贝操作
                               ; 没有上边的拷贝,这里也要出问题
.text:10009A8D                add    esp, 10h
.text:10009A90                lea    eax, [ebp+String]
.text:10009A96                push    [ebp+arg_C]
.text:10009A99                push    eax
.text:10009A9A                call    sub_10001201
.text:10009A9F                mov    ecx, eax
.text:10009AA1                call    sub_1000CC9A
.text:10009AA6                jmp    short locret_10009AAD
.text:10009AA8 ; ---------------------------------------------------------------------------
.text:10009AA8
.text:10009AA8 loc_10009AA8:                          ; CODE XREF: sub_10009A4C+Dj
.text:10009AA8                                        ; sub_10009A4C+13j
.text:10009AA8                mov    eax, 80004005h
.text:10009AAD
.text:10009AAD locret_10009AAD:                        ; CODE XREF: sub_10009A4C+5Aj
.text:10009AAD                leave
.text:10009AAE                retn    10h           ; 就这样返回,哦豁了

ModLoad: 41f50000 41fc7000  C:\WINDOWS\system32\mshtmled.dll
ModLoad: 10000000 10020000  C:\Program Files\StormII\Config.dll
ModLoad: 63380000 633f8000  C:\WINDOWS\system32\jscript.dll
(eec.ee8): Illegal instruction - code c000001d (first chance)
(eec.ee8): Illegal instruction - code c000001d (!!! second chance !!!)
eax=80004005 ebx=100116b0 ecx=0175f998 edx=00030001 esi=0039fe98 edi=00000000
eip=00410061 esp=0175f5ec ebp=00410041 iopl=0        nv up ei pl nz ac po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000            efl=00000212
*** ERROR: Module load completed but symbols could not be loaded for C:\Program Files\Internet Explorer\IEXPLORE.EXE
IEXPLORE+0x10061:
00410061 ff              ???

解决办法:
在厂商没有推出相应的补丁之前,
建议用户通过注册表对相应的CLSID:BD103B2B-30FB-4F1E-8C17-D8F6AADBCC05设置Killbit
或者将以下文本保存为.REG文件并导入:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{BD103B2B-30FB-4F1E-8C17-D8F6AADBCC05}]
"Compatibility Flags"=dword:00000400

--EOF--


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (25)
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
占个沙发。

还不懂怎么进行堆栈执行代码。。。
2009-5-1 18:20
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
???????
2009-5-1 19:47
0
雪    币: 268
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
呵呵,楼上没明白
2009-5-1 19:53
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你的分析有问题,堆栈溢出,wcscp就不可能正常返回,怎么还会执行到后面“retn 10h ; 就这样返回,哦豁了”?
所以要利用只能在wcscp返回时利用,RET到堆栈执行代码,那么就必须知道ESP的值以便返回时后执行,ESP的值显然很难确定(不同的软件环境ESP不可能一样),因此只是可能利用但是很难利用。
2009-5-1 20:17
0
雪    币: 615
活跃值: (1212)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
通病..........123456
2009-5-1 20:22
0
雪    币: 268
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
gkend 还是没明白
亲自去调试下?
2009-5-1 20:27
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8
很想知道如何找虫子?茫茫0101中
2009-5-1 20:42
0
雪    币: 268
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
ComRaider
2009-5-1 20:52
0
雪    币: 12
活跃值: (605)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
顶好色仙人~
2009-5-1 23:33
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
11
幸好用的是vista
2009-5-2 01:48
0
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
大侠解决方法好!本网吧借鉴了!谢谢!
2009-5-2 03:28
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
为什么官方不见任何动静呢?奇怪哩
2009-5-2 04:05
0
雪    币: 622
活跃值: (65)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
14
0 DAY 顶
2009-5-2 10:55
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
膜拜楼主Debug能力,

一个6帖,这一个主题就4帖

再次膜拜潜水能力
2009-5-2 11:00
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
为啥不加精....
2009-5-2 11:21
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
17
thank you,
2009-5-2 13:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
膜拜下....

有些头晕目眩~~

看看...
2009-5-2 14:46
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
sub    esp, 208h      ; 开辟208h的堆栈空间
我一直在纳闷,作者为什么用208h?一般来说,要么是256h。
我查了一下有关资料,是有根据。unicode string长度规定不能超过208h。按照这个说来,那么这个文件不应该列入漏洞。(wcscpy函数就是unicode 字串复制)
2009-5-2 18:35
0
雪    币: 229
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
我还在用老版本的暴风影音,貌似未被收购前的版本
2009-5-2 18:54
0
雪    币: 268
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
额...你赢了...
我这么给你解释下吧,希望你最好还是去调试下
不管它开辟的是208h,256h,还是1000h的空间,你的重点都不应该落在这里,
使用了wcscpy的程序不一定有溢出漏洞,没使用wcscpy也不一定没溢出漏洞,你关注wcscpy没错,但是你似乎走远了。

这个程序问题不在使用了wcscpy函数,而是在使用wcscpy函数之前,没有对我传入的参数长度进行有效性检查,从而导致了直接把超长的参数拷贝进入了堆栈,覆盖了堆栈中其他的有效数据,而函数在返回的时候,正好要使用这个堆栈里的数据,而这个堆栈里的数据已经被覆盖掉了,从而导致了EIP被传递了错误的数据(而这个错误数据是我们可以控制的)。

另外,我们忽视这个wcscpy(直接删除掉),没有调用这个函数,下面的swprintf也会导致栈溢出,原因和我上面的解释一样。

你真的没明白,最后一次建议你亲自去调试一下:)
2009-5-2 20:00
0
雪    币: 605
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cfz
22
这个播放软件蛮不错的,,,
2009-5-2 20:30
0
雪    币: 428
活跃值: (293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
楼主的境界让小弟佩服 ~~
2009-5-3 16:11
0
雪    币: 114
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
呵呵,占个座以后慢慢看
2009-5-4 12:56
0
雪    币: 220
活跃值: (721)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
益处脚本测试不成功,有测试成功的没?
2009-5-5 07:06
0
游客
登录 | 注册 方可回帖
返回
//