一款勒索软件的分析(未完待续)

文件信息 SHA1:1d03f92b8f824bb065552f0d9e6ddddb

NSIS脚本分析

使用7zip解压,可以看到其中一个文件是乱码,可能是加密的shellcode。

图片说明

下图是nsis的脚本,前面有很多都是无用的代码,一般都是首先看.oninit回调函数。

我们可以看到它通过wsprintf来拼接字符串,使用nsis的system.dll来调用外部dll。 将加密的shellcode映射到内存,

图片说明

另外system::call相关语法可以在http://nsis.sourceforge.net/Docs/System/System.html 找到。

最终通过

1
System::Call "$5p r13, i 66576)"

进入shellcode执行代码,shellcode入口点地址是r12,即$R1 + 73991。R1等于r11,也就是调用readFile函数时返回得文件buffer.

r13为加密PE文件,大小为66576,地址为0x83c0e69($R1 + 3689);

加密文件分析

解密shellcode

载入OD,直接在System.dll!Int640p函数下断,

图片说明

文件被映射到0x83c0000,因此shellcode的入口点在0x83d2107。

来到0x83d2107处,

图片说明,

查找内存值为0xDEADBEEF的内存地址,0xDEADBEEF为加密标志,表示后面的内容是加密的。

1
2
3
4
5
6
7
083D210E B9 EFBEADDE mov ecx,0xDEADBEEF
083D2113 E8 54000000 call 083D216C
083D2118 890424 mov dword ptr ss:[esp],eax ;esp=0x83d2118
083D211B 8B1C24 mov ebx,dword ptr ss:[esp]
083D211E 43 inc ebx
083D211F 390B cmp dword ptr ds:[ebx],ecx
083D2121 ^ 75 FB jnz X083D211E

0xDEADBEEF后面有2个比较重要的数据。

1
2
3
4
5
6
7
struct stc_encode
{
DWORD flag; //0xDEDBEEF
DWORD codeSize;
DWORD originCode_head; //未加密代码头四个字节
char encode_code[codeSize];
}

从下面这段汇编代码可以看出,它没有把xor key硬编码到程序中,而是通过暴破的方式获取xor key。这个样本最后查找到的xor key为0x6b891276

1
2
3
4
5
6
7
083D213A 8B5424 0C mov edx,dword ptr ss:[esp+0xC] ;[esp+0xc] 异或后的函数头部
083D213E 8B12 mov edx,dword ptr ds:[edx]
083D2140 33D3 xor edx,ebx
083D2142 3B5424 08 cmp edx,dword ptr ss:[esp+0x8] ;[esp+0x8] 原始函数头部
083D2146 74 03 je X083D214B
083D2148 43 inc ebx ;从0开始递增xor key,
083D2149 ^ EB EF jmp X083D213A

找到key,随后就是解密异或后的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
083D214B 895C24 10 mov dword ptr ss:[esp+0x10],ebx;xor key
083D214F 90 nop
083D2150 90 nop
083D2151 90 nop
083D2152 8B5424 0C mov edx,dword ptr ss:[esp+0xC]
083D2156 33C9 xor ecx,ecx
083D2158 311C0A xor dword ptr ds:[edx+ecx],ebx
083D215B 3B4C24 04 cmp ecx,dword ptr ss:[esp+0x4]
083D215F 7D 05 jge X083D2166
083D2161 83C1 04 add ecx,0x4
083D2164 ^ EB F2 jmp X083D2158
083D2166 8BE5 mov esp,ebp
083D2168 5D pop ebp
083D2169 5B pop ebx
083D216A FFE2 jmp edx ;跳到解密后的函数执行

这里jmp edx跳转到解密后的shellcode执行。继续以同样的方式解密3次,且每次的xor key都不一样。

解密PE文件

图片说明

通过 find_api_address找到所需要的函数并拷贝到堆栈。调用这些函数时使用 call [ebp-xx]调用。

图片说明

decrypt_pe有三个参数:被加密PE文件buffer、文件大小和密钥。该函数通过使用Crypt API来解密,返回解密后的PE文件地址。

图片说明
文章目录
  1. 1. NSIS脚本分析
  2. 2. 加密文件分析
    1. 2.1. 解密shellcode
    2. 2.2. 解密PE文件
|