【逆向】GandCrabV2.0 勒索软件分析

1、前言

        本次分析的是GandCrab勒索软件2.0版本,因为版本较早病毒服务器已经凉凉了,所以动态分析的时候并不会加密本地文件,调试的时候可以直接跳转到文件加密部分进行分析。另外除了勒索软件的一些常规操作外,为了逃避杀软检测病毒还进行了如下操作。

1 // 从资源解密执行shellCode。
2 // 内存加载exe和dll文件,通过反射注入执行病毒关键代码。
3 // 反调试和代码混淆。

2、样本信息

样本名称:GandCrab
样本类型:Win32 EXE
样本大小:308.51 KB (315912 bytes)
加壳信息: 无
微软命名:Trojan:Win32/GandCrypt.GA!MTB
MD5 校验值: f42774332fb637650ff0e524ce1b1685
SHA1 校验值:0012363a8a6efdd93fbd4624ee5e8ddf1f7be8d5
SHA-256校验值:15846ed8f38c0fac876b96a9d2eb55c3c98a428147ae372ade22efb854cfc4aa


 3、动态分析

行为概览详见哈勃:https://habo.qq.com/file/showdetail?pk=ADcGZF1tB2EIMVs%2FU2o%3D


 4、详细分析

4.1 流程图

4.2 模块一:GandCrab

从资源段中读取数据,解密后获取shellCode,然后执行shellCode进行后续操作。

分析过程中会遇到大量无意义的函数调用和耗费时间的代码,可以nop掉或直接跳过。

1 //可以通过以下方法判断一个函数是否是正常被调用:
2 函数参数是否正确
3 返回值是否被后续代码正确使用或引用

动态获取GlobalAlloc和VirtualProtect函数地址,拷贝加密资源数据

修改内存属性,解密并执行

Dump下shellCode方便IDA分析

4.3 模块二:shellCode

shellCode部分我没有在原文件中继续执行,而是使用Dump下来的数据自己写了个Demo进行加载。

shellCode部分主要执行的功能就是从自身数据中解密出新的PE文件,然后修复PE文件IAT和重定位,最后跳转到PE文件入口点继续执行。

分析过程中IDA识别了大部分函数,但是Main函数因为有花指令和栈针不平衡的问题不能F5,可以按照以下方法进行修复。

1 //下面简单说下修改步骤,修改后就能F5查看伪代码了。
2 在地址0x3C处按快捷键“U”取消函数定义,按“C”重新定义代码。
3 将地址0x38-0x3B处的数据修改为“0x90”,按“C”转换为NOP指令(IDC: PatchByte(0x38,0x90))。
4 重复步骤2,修改地址0x49-0x4B处的代码。
5 鼠标选中地址0x5-0x4C处代码,按“P”创建函数。
6 按“ALT+P”修改函数end地址:0x82F

 

利用"GetProcAddress"动态获取其他函数地址。

 申请缓冲区,解密PE1文件,解密后Dump下PE1文件保存到本地,后面拷贝PE头和区段数据时可以使用010Editor打开Dump下来的文件使用模版进行对比分析。

 

修改自身内存属性,并清空自身内存数据

拷贝PE1数据到自身内存空间,实现进程替换,这里以及后面的DLL文件都使用了内存加载的方式,全程无文件落地,大大减少了被杀软静态文件查杀的风险。

 

因为这里病毒直接使用内存加载了PE文件,而不是使用系统加载器进行加载,所以需要修复IAT导入表并对基址重定位进行修复。

 

修复完IAT和重定位表后,跳转到程序入口点继续执行。  

4.4 模块三:PE1.EXE

 模块三执行的代码和模块二类似,都是从自身解密新的PE文件,修复后执行,唯一不同的是这次释放的是一个DLL文件。

由于DLL文件的特殊原因,它不能像模块二的EXE文件一样拷贝数据到自身修复后就能直接执行,正常情况下一个DLL文件需要被加载才能正常执行代码。这里病毒使用了反射DLL的技术。

1 //区别:
2 常规DLL注入:dll文件必须在本地磁盘上,通过(CreateRemoteThread + LoadLibrary)加载。
3 反射DLL注入:dll文件只需要在内存中,通过(内存中解析PE头,调用自身导出函数)加载。

 解密PE2.DLL文件,老规矩将解密后的文件Dump下来,使用IDA进行分析。

 

 接下来,解析PE文件获取导出函数,进行调用。实际分析中像“获取导出函数偏移”这种函数可以根据上下文和返回值猜测函数功能,然后调试验证,没有必要详细分析。

 

分析导出函数时,可以直接使用OD和IDA对Dump下来的DLL文件进行调试。
修改IDA的模块加载基址和OD中的一致,查找关键代码后直接在OD中进行跳转,能够加快分析进度。
另外由于DLL文件没有通过加载器加载,病毒需要解决无法确定模块加载基址和调用系统API的问题。

 

通过PEB获取“LoadLibraryA”等函数地址。

接下来的操作与模块二基本相同,申请缓冲区,拷贝DLL文件(PE头,区段)数据,修复IDA,基址重定位等。这里不在赘述。

最后调用dllMain函数执行病毒关键操作。

4.5 模块四:PE2.DLL

4.5.1 初始化

初始化部分主要是获取系统信息,通过系统信息创建互斥体,然后检测杀软驱动,自拷贝到系统目录,设置注册表自启动,最后生成RSA密钥对并导出。

 获取系统信息(ip,用户,分组等),拼接字符串后创建互斥体。

 

 

检测卡巴等杀软驱动(klif.sys, fsdfw.sys,srtsp.sys,srtsp64.sys,NavEx15.sys,NavEng.sys)。

 

生成随机文件名自拷贝到系统目录,设置注册表自启动。

创建注册表自启动。

结束指定进程,防止加密时文件占用。

创建并导出RSA密钥对。

4.5.2 网络连接

通过"nsLookup"解析服务器IP,发送主机信息和RSA密钥对,接收http数据(循环执行,知道发送成功为止)

获取本机外网IP地址

Base64加密RSA公私密钥对,与系统信息进行拼接。

自定义算法加密拼接后的数据。

将自定义加密后的数据,使用Base64再次编码。

创建nslookup进程解析服务器IP地址,使用管道读取结果,然后发送。

4.5.3 加密数据

获取盘符类型,过滤特殊磁盘后,为每个磁盘创建加密文件线程。

过滤系统目录和sql文件。

创建勒索信息提示文档。

开始遍历目录,加密文件。

过滤加密文件后缀,和指定文件。

拼接加密文件名称,生成随机数1和2,使用RSA公钥加密2个随机数。

 1 //种子
 2 73840630  47 61 6E 64 43 72 61 62 47 61 6E 64 43 72 61 62  GandCrabGandCrab
 3 
 4 //随机数1
 5 0012F48C  78 0D EE B3 BE 2E 8A D1 87 24 61 DC F0 8F 97 00  x.畛?娧?a莛彈.
 6 
 7 //RSA加密后
 8 01980000  EB 9E A8 6F 7B 95 04 5F BD 62 3F 06 EF A1 A0 E2  霝╫{?_絙?铩犫
 9 01980010  E7 CC D1 2A E3 14 F4 DC C8 B7 1A 44 2A 7C 58 BA  缣??糗确D*|X?
10 01980020  AD 2F 09 AC DF B6 ED FC 96 B9 0F 92 49 D2 4E 2F  ?.俄鼥?扞襈/
11 01980030  1D D4 AD 5E BC E5 47 F9 EB 67 B7 B4 67 5F 00 C1  原^煎Gg反g_.?
12 01980040  5E B2 95 4A 94 1D 9A DA 56 D1 BC 7F EF AE 19 88  ^矔J?氌V鸭锂?
13 01980050  ED 15 70 63 E6 16 72 00 EB 10 78 08 67 BD C0 BD  ?pc?r.?xg嚼?
14 01980060  80 79 C6 18 F8 D8 7E E7 5B B9 C2 63 49 77 61 A7  €y?~鏪孤cIwa?
15 01980070  9A 56 EB 4F 5D 67 DF 12 18 8F 30 38 9B C3 27 B4  歏隣]g??8浢'?
16 01980080  65 B3 68 BE 88 F6 AD 34 E5 AF B3 2C 3F 56 61 81  e砲緢霏4瀵??Va?
17 01980090  15 E3 9F CC 88 D6 20 5D D6 99 67 8A 1A 77 53 40  銦虉?]謾g?wS@
18 019800A0  2A 61 E5 72 D6 D1 CF FF 1C 7B 1F A0 8E F3 1C E4  *a錼盅?{爭??
19 019800B0  CF 1A 1D FE 6A 3F 3A FA 8A 12 B7 89 BB 66 39 80  ??:鷬穳籪9€
20 019800C0  AC 38 39 45 2A 0C EA C5 D3 FE AF 01 9F C4 28 2F  ?9E*.昱誉?熌(/
21 019800D0  49 21 B2 EA BC 83 72 80 EC ED B8 F6 D8 0D 43 03  I!碴純r€祉个?C
22 019800E0  11 DB 20 F4 75 81 66 45 9C 29 66 51 97 63 C6 A3  ?魎乫E?fQ梒疲
23 019800F0  15 AF 20 C1 36 17 D3 19 30 6D 74 D1 18 78 B1 20  ???0mt?x?
 1 //种子
 2 0012F468  47 61 6E 64 43 72 61 62 47 61 6E 64 43 72 61 62  GandCrabGandCrab
 3 0012F478  47 61 6E 64 43 72 61 62 47 61 6E 64 43 72 61 62  GandCrabGandCrab
 4 
 5 //随机数2
 6 0012F468  5B 2D 4C 2E CB 87 20 A8 0C 40 81 B1 88 C7 7B AF  [-L.藝 ?@伇埱{?
 7 0012F478  44 D2 3E F4 B3 43 A1 FB 4F 6F 14 F8 26 82 6F D6  D?舫C←Oo?俹?
 8 
 9 //RSA加密后
10 01970000  C9 5A C1 8E 2D 09 A1 C4 3A A2 7F AC 05 F8 4D 7A  蒢翈-.∧:??鳰z
11 01970010  F4 B3 A9 BA 91 5E 19 94 CB 14 09 C2 DF DA 4F 2C  舫┖慯斔.逻贠,
12 01970020  1B 24 EE EB B1 7B DF 2F E5 F2 39 23 3F C3 17 D0  $铍眥?弪9#???
13 01970030  0E 7F 52 9F 6F 6A 29 DE A2 4B 26 D4 97 48 7D 0F  R無j)蔻K&詶H}
14 01970040  51 9F 9A 74 92 C3 57 5C 4F 2E FD 9E FE 2D B2 7A  Q煔t捗W\O.秊?15 01970050  CD FF A0 22 07 10 D2 62 99 7A EE 6D 01 B5 38 42  ??襜檢頼?B
16 01970060  2C F9 C3 14 C8 58 95 7F 8A 69 CB 75 63 AE 71 89  ,萖?奿藆c畄?
17 01970070  50 4C 0D EE B4 87 23 37 D4 23 9D 21 50 05 07 5A  PL.畲?7??PZ
18 01970080  67 09 9D C9 AA F0 EA ED A4 C7 E1 8A E4 F7 A3 66  g.澤觏で釆澉
19 01970090  5F 5E 91 5F 3E CF 13 2C 9B BF 66 8D FD D4 6C D8  _^慱>?,浛f嶟詌?
20 019700A0  4A 37 59 84 45 C0 2D 42 B6 68 44 9E 6B F3 18 F3  J7Y凟?B秇D瀔??
21 019700B0  9E 5C C5 28 7B BB 70 0A 79 B4 4C B4 32 42 7B 87  瀄?{籶.y碙?B{?
22 019700C0  89 9E 4E 7E BA D4 AB D0 5D 79 17 D0 BF 16 CE 64  墳N~涸]y锌蝑
23 019700D0  24 3B F8 80 93 2A 6A CE 37 C1 5D 9B E2 7C FB 91  $;鴢?j?羃涒|24 019700E0  A5 1F 00 65 D6 7F 85 28 7B 3C 19 65 01 59 EA 0F  ?.e??{<eY?
25 019700F0  30 6C 91 43 38 A3 F2 67 36 D4 B9 CA BB C7 3E 7A  0l慍8rg6怨驶?z

打开待加密文件,读取文件内容,使文件大小是16的整倍数。

加密完成后,将数据按4个部分进行写入,最后替换原文件。

 加密算法部分:

1. 将待加密数据与随机数1进行异或。

 2. 将数据与随机数2再次进行异或操作,然后使用作者自定义的代码进行最后加密。

1 //异或前数据:
2 01A30000  31 32 33 34 35 36 37 38 39 30 "1234567890" 
3 
4 //异或后数据:
5 01A30000  6D EE 71 7F 36 F8 AA 8C 51 BD 06 56 EA F8 C4 40  m顀6孮?V犋腀
6 
7 //加密后数据:
8 01A40000  3B B6 37 D8 45 83 71 B2 EE 17 CB EF 3A 94 26 BA  ;?谽僸差孙:??

加密完成后,按以下顺序将数据写入文件。

 加密完成后还剩一些自删除等常规操作,这里不再赘述了。

 

posted @ 2019-11-21 21:28  SunsetR  阅读(962)  评论(0编辑  收藏  举报