这个样本来源于一封伪造的钓鱼邮件,该钓鱼邮件伪造邮件主题为“你需要偿还债务”,邮件内容为故意伪造的信息,并包含邮件附件名为“您的账号.zip”。
图1.1
下载附件并解压,是一个伪装成xlsx的可执行程序,文件名为“付款发票.xlsx.exe”, 样本详细信息如下:
该模块的流程图如下图2.1。将加密的PE文件拷贝到内存,解密出真正的PE文件后,再拷贝到text节区,跳转到OEP开始执行代码。
图2.1
该勒索病毒程序未加壳,可以先直接拖到IDA中进行静态分析。定位找到WinMain()主函数,主函数首先循环检测内存的使用情况,确定是否有可分配的内存空间。
图2.1.1
如果内存空间足够,则跳出循环,执行图2.1.1中54行的LoadPayload()函数。该函数首先导入了kernel32.dll模块,再获得GlobalAlloc的函数地址。第一次分配大小0x372bc和地址为0x212960的内存空间,并将加密数据拷贝到这个内存空间中。
图2.1.2
接下,又两次调用了AllocAndDecrypt()函数,分配了两次内存空间(地址0x249c28和0x280EF0)。每次调用都将数据解密且存入当前的内存空间中。最终调用virtualProtect函数将第三个内存空间(地址0x280EF0)赋予可读可写可执行的权限。该内存起始地址即为payload函数起始地址。
图2.1.3
在内存(0x280EF0)成功加载解密后的payload模块后,执行图2.1.1中55行的函数,进入payload模块区域执行代码。使用OllyDbg动态调试进入payload模块入口点。
图2.1.4 payload函数起始地址
动态调试payload模块,首先获取了kernel32.dll模块的下列函数的地址。
图2.1.5
然后,payload模块又申请了一块内存空间,并将病毒真正的PE文件拷贝到这个内存。
图2.1.6
接着,跳转到新申请的内存空间中执行代码。
图2.1.7
内存空间3D0000的这部分代码作用是将已解密的病毒PE文件覆盖到进程映像中。
图2.1.8 从内存拷贝病毒PE文件到进程映像
最后,PE文件覆盖完成,该模块执行完毕退出,“leave”指令的下一条指令“jmp eax”, 返回到主线程的00403c7c处。
图2.1.9
主线程403c7c跳转到病毒真正的入口点403c33。
图2.1.10
但是,虽然已恢复了病毒真正的PE文件,但还不能dump下来静态分析(否则文件无法修复IAT),还需要等待程序动态加载DLL模块。
主线程第一条指令(call 407267)即为调用导入模块函数(图2.4.1中命名为Load Modules),动态解密修复IAT。
图2.2.1 导入第一个DLL
经过分析,IAT共修复了157+1=158个函数地址。
图2.2.2
使用Scylla工具附加到正在调试的病毒进程,设置OEP点击“Get Import”,成功找到了IAT中158个导入函数地址。
图2.3.1
将进程的“.text”节区dump下来。
图2.3.2
最后,修复PE文件和修复导入表。
图2.3.3
修复完成,可以加载到IDA中分析了。
病毒start函数总体结构如图2.4.1,下面对其中关键函数一一分析。
图2.4.1
首先,病毒进程先创建了一个互斥体,防止双开。
图2.4.2
然后调用解密文件配置信息的函数。
图2.4.3
开始解密前,通过CRC校验,才可以解密配置信息。
图2.4.4
动态调试得到解密信息。
图2.4.5
将配置信息导出,发现这是个json格式的文件,其各字段如下表:
wht-fld
(过滤目录)
"programdata","program files (x86)","windows","program files",
"$windows.~ws","intel","mozilla","application data","perflogs",
"tor browser","$windows.~bt","google","$recycle.bin","appdata",
wht-fls
"ntldr","ntuser.dat","ntuser.dat.log","autorun.inf","thumbs.db","bootsect.bak",
wht-ext
(过滤后缀名)
"icns","msstyles","cpl","hlp","lnk","deskthemepack","cmd","ics","adv",
"dll","ico","exe","com","nls","bat","rtp","spl","msu","rom","key","ocx",
"ps1","msp","386","drv","lock","mod","wpx","cab","idx","sys","icl",
"nomedia","cur","scr","hta","themepack","bin","diagcfg","shs","ldf",
prc
"sqlbrowser","isqlplussvc","msaccess","onenote","wordpad","thebat64",
"outlook","msftesql","winword","xfssvccon","excel","mysqld_opt","ocomm",
"firefoxconfig","mysqld","ocssd","dbeng50","thunderbird","ocautoupds",
"tbirdconfig","sqlwriter","synctime","mysqld_nt","mydesktopqos","dbsnmp",
"oracle","mspub","mydesktopservice","sqbcoreservice","sqlagent","encsvc",
dmn
duthler.nl;citiscapes-art.com;
svc
nobydy
(加密勒索文本)
img
QQBsAGwAIABvAGYAIAB5AG8AdQByACAAZgBpAGwAZQBz
ACAAYQByAGUAIABlAG4AYwByAHkAcAB0AGUAZAAhAA0A
CgANAAoARgBpAG4AZAAgAHsARQBYAFQAfQAtAHIAZQBh
AGQAbQBlAC4AdAB4AHQAIABhAG4AZAAgAGYAbwBsAG
接着执行RunAsAdmin函数,确保程序以管理员权限运行。
图2.4.6
执行完这些准备工作后,下面进入main函数,执行病毒的功能模块。
病毒程序的整个功能模块分析后的逻辑如图2.5.1:
图2.5.1
图2.5.1的11行,这个函数体内做了许多操作,包括获取系统信息、注册表写入、构造勒索文本等。下面对其中关键函数进行分析。
图2.5.1.1
首先是解密出注册表的写入路径和键名。
图2.5.1.2
然后,生成4个用于加密文件的密钥,并写入注册表。
图2.5.1.3
写入注册表效果如图2.5.1.4。
图2.5.1.4
这个函数,根据获得的用户的文件卷信息和处理器信息,进行CRC32计算得到特征值,然后拼接成用户的UID:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2020-2-16 18:06
被kumqu编辑
,原因: