某EXCEL漏洞样本shellcode分析

0x00 起因


近日我得到一个EXCEL样本,据称是一个过所有杀软的0day,经过分析之后让我大失所望,这是一个2012年的老漏洞,根本不是0day。虽然没捡到0day,但是这个样本中的shellcode还是相当有特色的,确实可以绕过大多数的杀毒软件和主动防御。 下面就来分析一下这个EXCEL EXP所使用漏洞和shellcode技术。

0x01 漏洞分析


该漏洞是CVE-2012-0158,一个栈溢出漏洞,漏洞成因是MSCOMCTL.OCX在解析一个标志为Cobj的结构的时候直接使用文件内容的数据作为拷贝长度,导致拷贝数据的时候可以覆盖函数返回地址,造成了一个标准的栈溢出漏洞。

 

关于这个漏洞分析网上有很多,这里不作为分析重点,我们还是主要看一下此exp的shellcode是如何编写以绕过杀毒软件的。

0x02 Shellcode1


该exp使用了MSCOMCTL.DLL里的一个JMP ESP地址作为RET,这样可以使EXP做到与操作系统版本无关,只与OFFICE版本有关:

enter image description here

然后跳转回堆栈之后会先执行一小段EGGHUNTER SHELLCODE,去解码并跳转到真正的SHELLCODE。

 

可以看到第一段小shellcode的作用就是查找并解密真正的shellcode,并跳转过去。到目前为止,所用的方法都比较常规,除了用了一个反常简单的反调试以外,并没有什么特殊之处。

而真正有价值的是第二段shellcode,也就是包含真正功能的shellcode。

0x03 Shellcode2


第二段shellcode是此exp的真正精华所在,这段shellcode应该也是使用C语言编写的,长度非常的长,主要做了以下几件事情:

可以看出作者还是用了很多技巧来绕过杀软和反调试的,由于这些代码太长了,我只贴重点部分进行讲解。

通过HASH获取API地址:

而后面每次调用的时候都会做判断,这里是CALL API的stub:


下面shellcode加载并修改了msvbvm60!PutMemVar,把上面的call stub代码写进去:


下面shellcode做的是从文件某偏移处读出exe文件内容,并解密,这块代码没有什么特殊的就不贴了,只有解密算法稍微复杂了一点:


读出exe以后有漏洞的xls就没用,要把xls文件恢复成正常文件,一方面为了后面能够正常打开,另一方面也为了能够隐藏漏洞:

修复完xls文件之后,就要做最后很关键的一部,以SUSPEND方式启动一个EXCEL进程,然后把刚才读出来的EXE内容写进新进程,再通过修改ImageBase指向EXE内容的地址,最后恢复新进程运行。这样一来,新启动的EXCEL进程实际执行的是木马EXE的进程。这样做的目的我分析有两个,直接释放exe并运行会被很多主动防御软件拦截,即使不拦截因为释放的exe不在白名单里,所做的敏感操作(例如修改注册表等)都会被主防拦截。而借EXCEL的壳执行exe则天然在主防白名单里,权限很高,木马不用考虑绕主防的问题。

这块的算法应该是:


 

得到ImageBase地址之后,用新分配的exe地址去替换:


这时候新的EXCEL进程就成功运行了,但实际执行的内容却是木马EXE。

接下来shellcode调用TerminateProcess结束自身进程,就完成了全部工作。后面的事情就交给木马exe来完成。

0x04 木马exe


虽然这个木马并没有什么特殊之处,我也顺便分析了一下。

首先在C:\Windows\tasks\下释放了一个exe文件,以保证木马每次随系统启动。然后删除注册表项HKCU\Software\Microsoft\Office\12.0\Excel\Resiliency避免EXCEL重启时报出错误。最后用EXCEL打开那个已经修复过的xls文件。

可以看到无论是在关键目录释放exe还是删除关键注册表项,如果是普通exe的话都是会被主防报警的,而正是因为在shellcode中借了EXCEL的壳,所以这些敏感操作才得以绕过主防。而且因为没有释放第一个exe文件,可以减少很多被杀毒的启发引擎查杀的机会。因为释放在tasks下的exe只需要实现木马功能即可,不用考虑释放执行的问题,而释放执行的操作才是最容易被启发式杀毒查杀的。

0x05 总结


这个xls样本虽然是个老漏洞,但是其shellcode还是很有创意,值得学习的。最大的亮点有两个:

一个是重写系统dll的内存,来间接执行API调用,以跳过回溯堆栈的主防拦截shellcode。

另一个是借EXCEL进程的壳来执行木马exe,以绕过主防对木马的拦截。

from:http://blog.jowto.com/?p=81