概述

VB编译时候有两种编译方式,分别是Native-Code和P-Code,P-Code也被称为伪代码,是介于高级指令和计算机底层之间的桥梁。

VBA(Visual Basic for Applications) 分为Source code、P-code和Execodes,其中最常见的Source code,也就是Alt+F11打开宏窗口之后可以直接看到的VBA代码。

P-code定义同上面的VB。

工程锁定

image.png

使用olevba 解析文件得到如下结果
image.png

这里可以看到,olevba只解析到了两行source-code,并且在下面给出提示:
VBA Stomping was detected: the VBA source code and P-code are different,this my have been used to hide malicious code.

根据olevba的提示可以得知该样本应用了名为VBA Stoping的免杀技术,vba stoping指的是攻击者将文档中的source code删除,仅留下编译之后的p-code,这样基于VBA源代码的检测技术将会失效,并且可以阻碍分析人员分析。

不过既然保留了pcode,那么我们便可以根据已有的pcode反编译回source code,只需要一个py库:pcode2code

安装方法很简单:
pip install pcode2code
image.png

安装完成之后可直接在命令行输入
pcode2code -h
以查看具体的参数
image.png

直接跟上文件路径,成功dump出source code
image.png

VBA Stomping

VBA stomping 是一种隐藏样本真实代码的技术,其实现原理是:
VBA代码第一次执行编译之后会得到一份pcode,当在相同版本的office环境下再次打开这个带宏的文档时,会优先执行编译之后的pcode,而不会重新去读取宏代码文件进行编译。

根据此特性,我们可以把VBA编译成pcode之后,清除原来的代码,使得一些静态检测引擎和类似于olevba这样的工具失效。

简单例子

新建文档,在视图窗口下,点击宏,弹出宏窗口。 将宏的位置选中为当前文档并创建宏
image.png

往宏里面写入一小段代码,该段代码会在当前文档路径下写入一个1.txt文件,内容为ABC

  1. Sub AutoOpen()
  2. Dim fso As Object
  3. Dim myTxt As Object
  4. Dim MyFName As String
  5. MyFName = "C:\Users\xxx\Desktop\VBAStomping\1.txt"
  6. Set fso = CreateObject("Scripting.FileSystemObject")
  7. Set myTxt = fso.CreateTextFile(FileName:=MyFName, OverWrite:=True)
  8. myTxt.Write "ABC"
  9. myTxt.Close
  10. Set myTxt = Nothing
  11. Set fso = Nothing
  12. End Sub

image.png

将其保存为docm之后,运行并打开该文档,启用宏代码,1.txt文件中将会写入ABC
image.png

7z打开docm文档,在word目录下找到vbaProject.bin文件,这是宏代码实际存储的文件
image.png

将该文件直接从压缩包中取出来, 使用十六进制工具打开并搜索刚才的代码
image.png

直接把这里写入的ABC替换成DDD
image.png

保存该vbaProject.bin,然后将其拷贝回7z压缩包中,替换原来的vbaProject.bin,然后关闭压缩包

此时打开原始的docm文件,宏代码写入的数据依旧是ABC
image.png

但是此时使用olevba这类工具查看该文档,可以看到代码解析出来已经是 Write DDD,并且olevba识别到了VBA stomping
image.png

重新打开vbaProject.bin文件,直接将这部分的代码用0填充
image.png

保存,填回到docm的包中,再次运行docm文档,依旧会执行宏代码的功能写入文件。
但是此时使用olevba解析文档结果如下:
image.png

此时,传统解析vbaProject的静态解析失效,需要解析pcode才能还原代码
image.png

CobaltStrike测试

使用CobaltStrike生成原始的宏样本,运行后正常上线:
image.png

将vbaProject文件拿出来,定位到具体代码,然后清空这部分代码
image.png

替换回去之后,运行,成功上线
image.png

通过这样简单的处理之后,VT查杀已经少了一大半,并且微软卡巴这种大厂第一时间也没有报毒
image.png

但是这种操作有个缺陷,目标主机的office版本必须与生成环境的office版本一致,若版本不同,office则会重新解析vbaProject,不会直接执行pcode。

这种方法适合在摸清目标主机基础设施之后,传入特定样本,这样若样本被攻击人员捕获。调试会导致pcode破坏,而vbaProject中无实际代码,算是一种保护措施。