概述
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。
工程锁定
使用olevba 解析文件得到如下结果
这里可以看到,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
安装完成之后可直接在命令行输入
pcode2code -h
以查看具体的参数
直接跟上文件路径,成功dump出source code
VBA Stomping
VBA stomping 是一种隐藏样本真实代码的技术,其实现原理是:
VBA代码第一次执行编译之后会得到一份pcode,当在相同版本的office环境下再次打开这个带宏的文档时,会优先执行编译之后的pcode,而不会重新去读取宏代码文件进行编译。
根据此特性,我们可以把VBA编译成pcode之后,清除原来的代码,使得一些静态检测引擎和类似于olevba这样的工具失效。
简单例子
新建文档,在视图窗口下,点击宏,弹出宏窗口。 将宏的位置选中为当前文档并创建宏
往宏里面写入一小段代码,该段代码会在当前文档路径下写入一个1.txt文件,内容为ABC
Sub AutoOpen()
Dim fso As Object
Dim myTxt As Object
Dim MyFName As String
MyFName = "C:\Users\xxx\Desktop\VBAStomping\1.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set myTxt = fso.CreateTextFile(FileName:=MyFName, OverWrite:=True)
myTxt.Write "ABC"
myTxt.Close
Set myTxt = Nothing
Set fso = Nothing
End Sub
将其保存为docm之后,运行并打开该文档,启用宏代码,1.txt文件中将会写入ABC
7z打开docm文档,在word目录下找到vbaProject.bin文件,这是宏代码实际存储的文件
将该文件直接从压缩包中取出来, 使用十六进制工具打开并搜索刚才的代码
直接把这里写入的ABC替换成DDD
保存该vbaProject.bin,然后将其拷贝回7z压缩包中,替换原来的vbaProject.bin,然后关闭压缩包
此时打开原始的docm文件,宏代码写入的数据依旧是ABC
但是此时使用olevba这类工具查看该文档,可以看到代码解析出来已经是 Write DDD,并且olevba识别到了VBA stomping
重新打开vbaProject.bin文件,直接将这部分的代码用0填充
保存,填回到docm的包中,再次运行docm文档,依旧会执行宏代码的功能写入文件。
但是此时使用olevba解析文档结果如下:
此时,传统解析vbaProject的静态解析失效,需要解析pcode才能还原代码
CobaltStrike测试
使用CobaltStrike生成原始的宏样本,运行后正常上线:
将vbaProject文件拿出来,定位到具体代码,然后清空这部分代码
替换回去之后,运行,成功上线
通过这样简单的处理之后,VT查杀已经少了一大半,并且微软卡巴这种大厂第一时间也没有报毒
但是这种操作有个缺陷,目标主机的office版本必须与生成环境的office版本一致,若版本不同,office则会重新解析vbaProject,不会直接执行pcode。
这种方法适合在摸清目标主机基础设施之后,传入特定样本,这样若样本被攻击人员捕获。调试会导致pcode破坏,而vbaProject中无实际代码,算是一种保护措施。