面试时拿到的一个勒索病毒样本,结束后整理了一下当时的分析报告来和大家分享一下。该样本比较老,2012年首次在VT上被记录。样本的逆向难度比较简单,没有什么反逆向技术,挺适合新手练手。
MD5 291456322adcac8f75437b9f4a715693
SHA-1 ac51cec89c0d563715a646ccf5d584f1ce1fdd5d
SHA-256 62e59afe5b604b14efeb68600ca3f179024b17d2e4babf30fa41ebbf91e2f710
从资源节区中加载配置文件数据,再通过密钥解密配置文件,配置文件。
解密算法如下:
void __stdcall __spoils<edx,ecx> sub_40211B(char *a1, int a2)
{
v2 = a1;
v3 = a1;
v4 = 0;
for ( i = a2; i; --i )
{
if ( v4 == 16 )
v4 = 0;
v6 = *v2++;
*v3++ = key[v4++] ^ v6; // key:89 EF 37 A2 01 55 C9 80 7F 69 83 14 2D 45 6B 03
}
}
在start函数中,通过GetLogicalDrives函数获取最大可用磁盘设备号,从A盘开始到最大可用磁盘设备号进行遍历,遍历分区下所有目录和文件,并将目标文件类型加密。
在sub_4013A8函数中,我们可以看到待加密文件的文件类型有:*.zip、.rar、.7z 、.tar、.gzip、. jpg、.jpeg、.psd 、.cdr、.dwg、.m ax、.bmp、.gif.* .png、.doc、.doc x、.xls、.xlsx、.ppt、.pptx、.tx t、.pdf、.djvu.* .htm、.html、.md b、.cer、.p12、. pfx、.kwm、.pwm. .1cd、.md、.mdf 、.dbf、.odt、.v ob、.ifo、.lnk. .torrent、.mov、 .m2v、.3gp、.mpe g、.mpg、.flv、. avi、.mp4、.wmv、.divx、.mkv、.m p3、.wav、.flac、.ape、.wma、.ac 3、.exe、.iso、. dll,以及.html。
指定的加密大小是nNumberOfBytesToRead (0x1B03E4),也就是默认加密的最大长度为1770468个字节。此外,加密的位置是从第48字节以后开始的。
通过在注册表“HKEY_CLASSES_ROOT”根下添加一个键“.lUUUUUUUUU”,此后所有以该键为文件后缀的文件启动后,会运行依据HKCRAOUIJJJBNYUXWCNshellopencommand(Default)下设置的程序。
HKEY_CLASSES_ROOT控制键包括了所有文件扩展和所有和执行文件相关的文件。它同样也决定了当一个文件被双击时起反应的相关应用程序。
相关代码位于函数sub_402342。
加密文件使用的tea加密密钥是根据一组固定密钥根据文件名末尾地址进行4轮循环异或生成新密钥。
对文件进行加密使用到的加密算法有两种,根据配置文件来决定使用哪一种算法进行加密:
unsigned __int32 __stdcall tea_decryph(unsigned int *a1, unsigned __int32 *a2)
{ v2 = 0x9E3779B9 * dword_4065A5;
x = _byteswap_ulong(*a1);
y = _byteswap_ulong(a1[1]);
do
{
v5 = y - ((dword_406591 + (x >> 5)) ^ (v2 + x) ^ (dword_40658D + 16 * x));
v6 = x - ((dword_406589 + (v5 >> 5)) ^ (v2 + v5) ^ (newKey + 16 * v5));
v7 = v2 + 0x61C88647;
y = v5 - ((dword_406591 + (v6 >> 5)) ^ (v7 + v6) ^ (dword_40658D + 16 * v6));
x = v6 - ((dword_406589 + (y >> 5)) ^ (v7 + y) ^ (newKey + 16 * y));
v2 = v7 + 0x61C88647;
}
while ( v2 );
result = _byteswap_ulong(x);
*a2 = result;
a2[1] = _byteswap_ulong(y);
return result
该勒索病毒的勒索逻辑并不严密,能够轻易解密。加密后解密密钥被保存在样本数据段中,加密算法也并不复杂,可以写脚本直接反解被加密的文件。由于解密算法也在样本中,所以可以修改代码逻辑去主动执行解密程序。比如,可以修改sub_401AB9函数中的代码逻辑,将输入的密码计算得到的密钥改成保存的正确密钥。
前者思路太麻烦了,这里提供第二种解密思路:将下图画圈处硬编码地址改为0x406DC9即可,也是最简单的修复方法。
运行后成功执行解密程序,所有被加密的文件均被解密还原。
本文作者:ChaMd5安全团队
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/192592.html