一、介绍
本篇文章为VBA脚本隐藏技术的最后一篇,将介绍如何在保证VBA脚本正常执行的情况下,使分析人员无法打开编译器。
那么为什么需要分析人员无法打开编译器呢?
首先,我们需要引入一个知识点。
在上篇《VBA隐藏技术stomping》中,我们分析过,当编译脚本的VBA版本与运行时版本一致时,才能执行P-Code,可以通过修改VBA脚本的源码,来欺骗OLE分析工具,但是该方法无法欺骗编译器,因为编译器版本与脚本文件运行版本一致时,编译器会将P-Code反编译,分析人员可以看到VBA脚本的真实代码,stomping技术便会失效,因此我们需要阻止分析人员打开编译器。反之,当我们分析恶意代码时,遇到编译器无法打开的情况下,如何排查该技术的使用,下面我们介绍如何实现编译器崩溃。
二、VBA编译器崩溃
我们先创建一个OFFICE文档文件,更改文件类型为zip压缩文件,然后解压,在word目录下找到vbaProject.bin。
打开vbaProject.bin文件,找到PROJECT流处的”Module=“,可以直接搜索特征”/&H00000000“,找到“Module=NewMacros“,NewMacros的非固定值,该字符串需要自行判断,为了使编译器崩溃,我们需要修改该字符串。
下图中,NewMacros被清零,也可以将Module=NewMacros删除,但是换行符"0x0D,0x0A"需要保留,同时后面的信息需要前移。
修改后保存,然后重新将文件打压缩包,然后修改文件后缀,改为文档文件,打开文件让宏执行,观察宏是否能够正常执行,如果宏能够正在执行,打开红管理器,点击编译。
当点击编译时,提示未知的错误则说明修改成功,编译器无法打开。
注:高版本OFFICE会提示位置的错误,如果使用的是低版本的OFFICE,OFFICE会随编译器一同崩溃。
三、实例
下面我们介绍一个使用VBA编译器崩溃技术的实例,FORTINET发布了一篇关于Energoatom公司被钓鱼文件入侵的报告,其链接为https://www.fortinet.com/blog/threat-research/malware-disguised-as-document-ukraine-energoatom-delivers-havoc-demon-backdoor。
钓鱼文件HASH[b773fa65bb375e6fe6d387f301f6bf33219189ea1d4a06762e965a9eba7de4e8],该钓鱼文件是一个word文档,报告中称钓鱼文件中VBA脚本使用了重定向技术,将vbaProject.bin重定位到EbDYTPZ[.]vEypm,随后在打开word查看VBA代码时,编译器崩溃,分析人员怀疑是PROJECT流中包含了错误签名导致编译器崩溃,因此使用oletools对EbDYTPZ[.]vEypm进行了源码提取。
图:FORTINET报告
我们找到该样本,对EbDYTPZ[.]vEypm重新进行了分析,发现导致编译器崩溃的原因是攻击者删除了Module的信息。同时确认该样本中没有使用stomping技术,因此使用OLE分析工具解析代码不会影响后续分析。
四、修复
因为微软没有开源P-code解析方法,所以我们在分析恶意代码时,如果遇到同时使用VBA脚本编译器崩溃和stomping技术的样本时,又该如何应对呢?
根据上文提到的方法反推,可以试着修复VBA文件,查看崩溃原因是否是由Module信息的缺失引起的,如果是该原因,修复该处缺失的信息。
那么我们如何知道Module模块的名称呢?
此处我们对文件EbDYTPZ[.]vEypm文件进行修复,并验证之前的分析结果。
常规OFFICE文档文件中,在word目录下的vbaData.xml文件中含有模块信息。
在[b773fa65bb375e6fe6d387f301f6bf33219189ea1d4a06762e965a9eba7de4e8]中,vbaData.xml文件被重定位到iuM.dsn,因此我们打开iuM.dsn。
我们可以看到wne:name="Project.Module1.AutoOpen",其中Project代表Project流,Module1是Module的名字,等于同我们自己生成文件的NewMacros,后门AutoOpen是函数名。
打开EbDYTPZ[.]vEypm文件,通过特征”/&H00000000“特征定位Module,可以发现该处并没有Module模块,确定攻击者将该字段抹除。
因此修复该文件需要Module的信息重新编辑进去,其余信息后移。
修复完脚本文件后,重新将文档文件打包,修改后缀,然后打开word,点击的编译器编辑按钮,发现VBA脚本编译器可以正常打开。
接下来,我们分析一下为什么修改Module信息会导致崩溃。
将调试器附加到word进程,点击编辑后,word会执行vbe6.dll中的代码,该dll创建Visual Basic环境,当加载Module1实例时,因Module信息确实,对象创建失败,this指针为空。
在后面的调用中会产生地址错误。
我们将脚本修复,重新附加word进程,对象创建成功,this指针指向正确的位置。
五、总结
VBA编译器崩溃技术与stomping和重定向技术没有冲突,三者可以相互组合使用,互补每个技术中存在的缺陷,希望读者可以在攻防对抗中,灵活使用这些技术。