Locky Ransom分析

一直想知道使用NSIS打包的勒索病毒是怎么解密payload然后执行加密动作的,特意找了个使用NSIS打包的勒索病毒分析了下。

使用7z打开NSIS程序,我们可以看到如下文件:

图片说明

其中system.dll文件为NSIS的插件。

打开nsis脚本,部分代码如下(手动添加的注释):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
; --------------------
; SECTIONS: 1
; COMMANDS: 25
Function .onInit
SetOutPath $INSTDIR ;设置输出路径为$INSTDIR
SetOverwrite off
File Candidate.bv ;将Candidate.b释放到$INSTDIR
StrCpy $R4 requiems::Manteltree() ;字面意思,拷贝字符串到$R4
File requiems.dll ;将requiems.dll释放到$INSTDIR
System::Call $R4) ;使用System::call函数调用$R4,也就是requiems::Manteltree()
; Call Initialize_____Plugins
; File $PLUGINSDIR\System.dll
; SetDetailsPrint lastused
; Push $R4)
; CallInstDLL $PLUGINSDIR\System.dll Call
FunctionEnd
Section ; Section_0
SectionEnd

从NSIS脚本可以看出,释放了两个文件 requiems.dll、$PLUGINSDIR\System.dll和Candidate.bv。使用System::call来调用requiems.dll::Manteltree(),实际上Manteltree这个导出函数并不存在。

使用od加载文件,在LoadLibraryExW下断,一直按F9运行到如下图,要加载requiems.dll文件时。

图片说明

因为这个文件主要代码都在dllmain入口点中,因此等到LoadLibraryExW运行完后,其实入口点代码已经运行完了。

我们需要在它刚加载没运行完时在dllmain处断下。Ctrl+M查看requiems有没有被映射到内存,没有则运行到返回(Ctrl+F9)。再次查看内存映射情况。当出现如下表示已经加载到内存了。

图片说明

找到dll文件的入口点,下断,F9运行。

从父进程中偷取kernel32.dll动态库地址和导出函数基址 。

图片说明

解密后面注入需要的API字符串

图片说明

然后调用ReadFile读取Candidate.bv,内容是加密的。

图片说明

在0x3c0000处有一段超大循环代码,把跳转全部NOP掉。

图片说明

在requiems.dll内调用CreteProcess以挂起的方式创建子进程,

图片说明

从下图中可以看到,调用WriteProcessMemory向子进程注入了一个PE文件,该PE文件由前面的Candidate.bv文件解密。

图片说明

拿到被注入PE文件

Alt+M切换到内存,我们知道要注入的exe文件保存在0x20ff0020地址处。

图片说明

dump该段内存到文件。

参考网址

http://omega.idv.tw/nsis/Contents.html

https://www.youtube.com/watch?v=r4_Ca4ZgU0I&lc=z12ozb0iosq4vh5oj04cj5oqmybwtp1ynug0k

https://hshrzd.wordpress.com/2016/07/03/unpacking-nsis-based-crypter-step-by-step/

文章目录
  1. 1. 拿到被注入PE文件
  2. 2. 参考网址
|