本文仅从反漏洞exploit、反调试和反逆向三个方面来阐述如何保护ActiveX控件的安全。
1、反0day攻击:
1.1 ActiveX控件所受的0day攻击威胁
黑客通过对ActiveX控件进行逆向分析,可以挖掘控件的漏洞信息,从而对具有溢出漏洞的ActiveX控件实施0day攻击。虽然溢出攻击采取的形式有很多而且不一样,但是采取的攻击过程是一样的,都是构造精确的shellcode,然后触发包含有漏洞的代码接收shellcode,并实现跳转。
下面以阿里巴巴淘宝旺旺ActiveX远程栈溢出为例,来描述ActiveX控件所遭受的栈溢出0day攻击,其它形式的溢出与此类似。
软件说明:
淘宝旺旺是阿里巴巴出名的即时通信软件,主要用于对淘宝网提供IM支持。
受影响的软件版本:
2006年12月22号之前的淘宝旺旺或者某些未升级版本。
漏洞细节:
漏洞存在于由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 函数strcat,strcat的原形如下:
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
对漏洞细节中的第3,4,5条指令的研究可知,从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指令所在的地址,cpu取eip执行时,就相当于执行jmp esp-X,其结果是cpu跳转到恶意代码的开始,从此往后cpu取恶意代码指令在系统上执行。
上面这段脚本用IE打开会呈现一个按钮,一旦用户按下这个按钮,就会触发调用ActiveX控件的导出函数RunWangWang。当RunWangWang函数接收黑客精心构造的shellcode参数之后,就会产生栈溢出并跳转的真正的shellcode去执行,从而实现恶意攻击。
③ 栈溢出exploit
恶意html执行后,ActiveX控件的RunWangWang函数被调用,并以包含shellcode代码的内存的地址作为输入参数。下图 1-4描述了RunWangWang函数执行到ret指令之前系统栈状况: