关键词
逆向工程、反混淆、Arechclient2
最近,SentinelOne与vx-underground合作,首次举行恶意软件逆向分析挑战。其中,SentinelOne要求网络安全研究人员提交他们的分析成果,以展示他们的才能,并将他们的见解带给更多的人。
本文演示了一种对恶意软件样本进行逆向工程问题的解决方法,其中不仅强调了分析样本所采取的具体步骤,还强调了随着逆向的展开所进行的逻辑推理。本文展示了当研究人员面临挑战时,是如何应对并解决的。对于任何希望学习或发展其逆向工程技能的人来说,这是一个极好的例子。
本文将回顾分析ArechClient2样本的过程。包括样本的初步分析、反混淆、脱壳和提取载荷。然后分析.NET有效载荷,揭示其配置信息和C2信息。
该样本由两个文件组成,一个是可执行文件,另一个是a3x文件。经过快速简略分析,发现a3x文件是AutoIt编译的脚本。可执行文件图标是AutoIt的徽标,版权信息显示它是AutoIt。因而初步判断此可执行文件运行时可能会执行a3x文件。
在Windows沙箱中运行了该文件以快速获取信息,并立即获得了Windows Defender对其MSIL的查询结果:特洛伊木马。这表明此AutoIt部分只是第二阶段.NET二进制文件的加载程序。如果您不熟悉这些术语,“MSIL”代表Microsoft中间语言,它是.NET二进制文件编译的中间字节码。
这个a3x脚本是可读的,所以在将其放入Visual Studio Code后,可以看到如图1所示结果。
图1:a3x脚本
起初这看起来很杂乱,但仔细看会发现了一些突出的信息:对 “DoctrineDrama” 函数的调用看起来像是字符串解密。所以下一步是找到这个函数。通过使用搜索功能查找其名称,直到找到实际的实现进程。所有函数都以关键字“Func”开头,并以关键字“EndFunc”结尾,这使得函数便于识别。图2为 “DoctrineDrama”函数代码。代码是模糊的,似乎包含一些花指令。第一步是缩进代码以便于阅读。
图2:DoctrineDrama函数
观察循环中的switch,case代码,可以发现只有使用了ExitLoop指令的分支是重要的。通过查看switch的循环条件可以确定以上推测。在函数的开头,第二个变量是循环条件,初始值为921021。查看switch循环,该值只与包含ExitLoop指令的case分支相匹配,这意味着其他的case分支均未被运行,可以被忽略。将原始代码中的不必要的循环,未被使用的指令删除后,结果如图3所示。
图3:修改后的DoctrineDrama函数
-
一个字符串 -
一个分隔符字符 -
一个确定分隔符搜索模式的可选参数
图4:DoctrineDrama完全清理版本
通过查看图4所示的代码完全清理的版本,在C#中重新实现了解密过程,以构建一个简单的反混淆器,如图5所示。
图5:反混淆器
反混淆器使用简单的正则表达式匹配每一个对DoctrineDrama函数的请求,并将其替换为解密的字符串,并输出所有解密字符串的列表。
图6:错误信息弹窗
这消息框声明违反了一项EULA,但在调试过程中,并未阅读或同意过相关内容,因而无法再进一步调试恶意软件。幸运的是,x64Dbg有一个内置的AutoIt EULA旁路,称为隐藏调试器(PEB)。我们能在“Debug>Advanced>Hide Debugger (PEB)”路径找到,这可以确保在提升模式下运行x64Dbg。
在处理了相对简单的反调试之后,我们让它运行。调试时,可执行文件会生成一个文件对话框,请求一个a3x文件,当在没有调试器的情况下运行时,它会自动找到脚本文件。在将其指向脚本文件后,我们让它一直运行到CreateProcessW函数上设置的断点被触发。在这一点上,jsc.exe文件将以挂起模式启动,该模式会暂时停止大部分活动和处理,但仍然保持一些基本功能以便能够迅速恢复到正常操作状态。
检查进程浏览器(Process Explorer)可确认AutoIt脚本中解密的路径确实是注入目标。并在NtResumeThread函数上添加了另一个断点,这将在注入完成后,中断执行线程恢复执行恶意软件。
图7:进程浏览器
接下来需要处理从加载程序转储的托管载荷。其内存映像被严重混淆,需要从类模块,也称为全局类型中寻找有效信息。之所以首先检查这个类,是因为它的构造函数是在程序入口点之前调用的。许多混淆处理程序在入口点前调用它们的运行时保护功能,或字符串解密之类的函数。
以上猜测是正确的, 在模块(0x06000003)中发现了一个名为“c”的字符串解密方法,如图8所示。该方法从内嵌的资源中读取加密的字符串数据,然后对其执行单个异或运算解密。用于解密的密钥是通过参数提供的,可以猜测每个字符串都有一个对应的解密密钥。
图8:c函数
图9:解密程序的调用代码
图10:样本的二进制文件
图11:引用xj类的代码
图12:xj类的代码
图13:参数的本地窗口
图14:修改的字符串解密方法
图15:字符串处理
由于深层次的混淆以及与现有偷窃者具有相当相似的行为,将不再进一步调查此有效载荷。至此,我们揭示了最重要的IOCs,并对偷窃者的目标有了很好的了解。
在分析转存的字符串后,可以发现,一些指标可能有助于将恶意软件总结为某个恶意软件家族。虽然这个样品看起来确实很像Redline工具,但实际上它不是那个恶意软件家族的成员。通过观察,发现这些二进制数据对象看起来像是C2通信:
图16:转存的字符串
图17:执行ArechClient2样本的网络捕获
我们发现初始的加载程序是在AutoIt中实现的,并使用进程镂空加载基于.NET的有效载荷,我们重构了字符串解密方法,使我们能够部分的反混淆加载程序。我们使用调试器和ExtremeDumper工具转存了托管有效载荷。我们分析并调试了托管有效载荷,以显示有效载荷的配置信息,其中包含C2信息。
种类 |
指标 |
C2 |
77.73.133.83:15647 |
Potential Fallback C2 |
34.107.35.186:15647 |
URL for fallback C2 |
https[:]//pastebin.com/raw/NdY0fAXm |
.NET payload Test.exe |
SHA1: 054742329f83a5d177dd1937992e6755f43c420e |
AutoIt loader 45.exe |
SHA1: 2a4062e10a5de813f5688221dbeb3f3ff33eb417 |
AutoIt script S.a3x |
SHA1: 4397b1d855e799f4d38467a848cda2273c1c6c73 |
编辑|胡睿东
审校|何双泽、王仁
本文为CNTIC编译整理,不代表本公众号观点,转载请保留出处与链接。联系信息进入公众号后点击“关于我们”可见。
原文始发于微信公众号(国家网络威胁情报共享开放平台):逆向工程演练:分析Arechclient2示例
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论