hancitor unpack Part2

阅读量    94975 |

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

intro

这是hancitor装载器的第二部分内容,对于恶意代码装载器来说,总是有着千变万化的方法去实现恶意代码,我仅学习这些代码并期望能在之后为此做出贡献 !

MD5 (Hancitor – Packed): 7e9ba57db08f53b56715b0a8121bd839
MD5 (Hancitor – Unpacked): a68de37bf71d2e5f5c9ab6c84f2fd695

样本分析

首先是导出函数,该样本除DllEntryPoint有8个导出函数,都是常见的单词,一般用于减慢分析样本的速度。

对于分析这种样本的脱壳和有趣的部分,我们的分析流程如下:

首先f9 运行到entry point

然后来到kernel32.dll的VirtualAlloc函数打下断点,虽然提示地址无法执行,我们仍需要设下断点

等待一会儿后就会命中断点了,此时我们根据msdn观察栈数据

LPVOID VirtualAlloc(
  [in, optional] LPVOID lpAddress,
  [in]           SIZE_T dwSize,
  [in]           DWORD  flAllocationType,
  [in]           DWORD  flProtect
);

然后我们直接执行到retn。

第一,我们需要在VirtualAlloc函数入口打下断点,运行并hit到断点后,Return 返回到我们的代码段。直到我们看到如下几个特殊点:

  1. call to ebx + 2113E4 ,是用于动态调用VirtualAlloc**函数的,
  2. rep movsb -用于把shellcode写入到刚刚申请的空间
  3. jmp eax – 跳转并执行shellcode

因为shellcode存储在eax寄存器中,我们使用follow in dump即可找到对应的shellcode,是一个以字节组E8 00 00 00 起始的经典trick。

同时,根据习惯,我们可以猜想完整的unpack应该在shellcode的附近。我们运行两次直到我们第三次命中断点,此次生成了一大段的空白段供shellcode编写

我们在此处第一个字节打下硬件断点并运行

第一次运行只生成了首字节,第二次如下

第三次如下

而实际上操作该地址的是以下几个汇编指令

通过x32 dbg的图像功能显示如下,我们在一个小循环中找到一个带有一些经典的操作码,例如旋转右侧和排除或(ROR和XOR OPCODE)。

在这个特殊的循环中,加密主体在过去两年的恶意样本中同样类似出现过,例如:Hancitor,Zloader,SquirrelWaffle,Ursnif

通过在leave opcode上设置断点,我们可以使循环结束,而一旦循环结束,我们就可以看到ASCII字符M8Z表明这是一个APLIB压缩后的代码。

那么既然我们直到了这是一个APLIB实现的压缩,我们现在就是要寻找一个解压缩的代码。

  1. 首先删除硬件断点
  2. 在APLIB 压缩的headers区域设置硬件访问断点
  3. 运行

实际上是把ESI的数据解密后移动到了EDI地址处(这里的地址发生变化是因为中间发生失误运行了程序导致我重新跑了一次,地址变化了(0x110001—》 0x190000))

我们在retn处打下断点并运行后访问0x000117041地址处即可找到unack后的文件。此时我们使用processHacker进行提取

首先dump出0x110000处的数据

然后提取处0x7041物理地址处的数据即可。

然后这个文件是一个完整的文件,我们可以直接看到导入函数表和代码数据了。

 

收尾

这也是一个比较好玩的样本,本篇文章的分析仅通过以下文章学习分析和自己总结得出,不得不感叹技术的力量,感谢观看!
https://elis531989.medium.com/the-squirrel-strikes-back-analysis-of-the-newly-emerged-cobalt-strike-loader-squirrelwaffle-937b73dbd9f9

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多