在此之际, 我想向你展示如何对Maze(迷宫)勒索病毒进行脱壳. 正如我在推文中所提及的那样, 想要获取它运行良好的内存转储会有一些棘手, 但只要拥有耐心, 你也可以做到.
每次我不得不面对加壳的勒索软件时, 我都会对其在脱壳过程中使用的常见Windows API函数下断点. 比如说, 勒索软件会在创建进程时使用类如CreateProcess 的函数, 在解压数据时会使用RtlDecompressBuffer函数, 或是使用VirtualProtect函数去改变内存区域的读写权限, 以及其他种种. 向这些常见函数设下断点可以在脱壳过程中触发停下, 以便进行后续分析. 然而这次, 事情并不这样简单.
我遇到的第一个问题就是跟调试器有关. 我尝试使用 Ollydbg 1.10 和 x32dbg这两款调试器来分析本例样本. 使用Ollydbg的话, 一运行样本调试器就会崩溃, 也许这是因为1.10版本是在Windows 7发布之前很古远的时间构建的, 并不能很好地兼容系统. 使用x32dbg的时候, 调试器则会持续不停地抛出数据未对齐的异常, 以致我根本没法继续分析. 我需要一个尽快的解决方案, 但是我的虚拟机内尚未安装有Windbg和IDA, 因此我决定使用更新的Ollydbg版本, 并且事实证明它确实能成功地调试样本.
我遇到的第二个问题就是, 我设下的那些断点里没有一个被触发到. 我对以下这些函数设下了断点: CreateProcessA, CreateProcessInternalA, CreateProcessW, CreateProcessInternalW, VirtualProtect 以及 RtlDecompressBuffer. 然而,我跳过了一个我往常脱壳都会跳过的函数,因为它在通常情况下都会触发非常多次:VirtualAlloc. 通常来说,勒索软件会在脱壳过程中使用VirtualAlloc来创建新的内存区域用于存放代码桩. 样本有时创建的虚拟内存区块仅有少许, 而有时又会特别多, 所以这就是我跳过这个函数的原因, 但这次, 这个函数有着奇效.
该勒索病毒在创建用于存放勒索代码的虚拟内存区块前一共触发了三次断点. 第一次触发时它通过EAX寄存器返回一块合法的内存区域地址, 而第二次触发时则返回了NULL, 第三次触发则使用了以下参数进行调用(如下图所示):
当调用返回, 我们可以看到新的内存区域已经被提交申请:
这块内存区域的地址是0x180000.
如果你重新运行一遍勒索病毒, 你会看到这块区域立刻填充了一些有趣的数据:
区域内填入了完整的PE映像. 但还不要高兴太早. 如果你现在就将这块内存区域转储出来, 你会发现, 它不包含任何的IAT并且字符串的交叉引用都失效了.
我试过使用IMPRec和ChipmREC来修复IAT, 但是两个工具都因为对VirtualProtectEx 的调用而失败了(我也并未对该错误进行深究). 然而还有一个跟IAT与交叉引用相关的问题. 由勒索病毒新建的内存区域会被用作存放新的代码桩, 来继续完成攻击, 并且它位于我们正在调试的这块内存映像之外的位置. 尽管你可以将内存映像转储出来, 但这部分新的虚拟内存区域是不会跟着我们的映像一同转储出来的.
我决定在最后一个VirtualAlloc 断点触发时进行一小段的跟踪调试, 并观察到最后一次调用VirtualProtect 完成时赋予内存区域PAGE_EXECUTE_READWRITE 的权限, 并随着壳代码跳到新的入口点.
We land in this new region because of a CALL ECX:
我们在CALL ECX后到达了新的内存区域.
在这里, 我使用OllyDumpEx 并设置以下选项来转储内存:
就如你所看到的那样, 我修改了新内存区域的基址(0x180000)并随后勾选了Auto Adjust Image Base Address和 Rebuild DataDirectory (Follow ImageBase change)这两个选项.
然后, 只需点击Dump 按钮即可(不必在意OllyDumpEx给出的警告.):
可以看到, 转出的二进制文件中包含有IAT和交叉引用, 这样我们就可以基于此继续进行我们的分析了.
就如你所看到的那样, 对这个勒索病毒进行脱壳并非难事. 重点在于使用正确的工具和找到合适的位置将其转储.
最后要申明的就是, 如果你在本文中发现有任何错误的地方, 请务必让我知道. 任何有关如何改善这个脱壳系列文章的见解也欢迎告知. 不必犹豫直接来联系我吧.
再见!
91514e6be3f581a77daa79e2a4905dcbdf6bdcc32ee0f713599a94d453a26fc1 6a22220c0fe5f578da11ce22945b63d93172b75452996defdc2ff48756bde6af 5c9b7224ffd2029b6ce7b82ea40d63b9d4e4f502169bc91de88b4ea577f52353
原文链接: https://poxyran.github.io/poxyblog/src/pages/22-10-2019-unpacking-malware-series-maze-ransomware.html
翻译: 看雪翻译小组 Vancir
校对: 看雪翻译小组 Nxe
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!