【病毒分析】2024年网鼎杯朱雀组REVERSE02——关于勒索木马解密详解
字数 1443 2025-08-20 18:17:41
勒索木马解密分析教学文档:网鼎杯朱雀组REVERSE02题解
1. 背景介绍
1.1 网鼎杯比赛
- 国家级网络安全大赛,第四届主题为"网数融合,鼎筑未来"
- 目标:挖掘和选拔网络安全实战化人才,筑牢网络安全防线
- 被誉为"网络安全奥运会"
1.2 题目背景
- 题目名称:REVERSE02
- 所属组别:朱雀组(能源、电力、化工、国防等行业单位)
- 题目类型:勒索木马逆向分析与解密
2. 恶意文件基础信息
2.1 加密器基本信息
- 文件名:ReMe.exe
- 编译器:Microsoft Visual C/C++(16.00.30319)[LTCG/C++]
- 大小:499.00KB
- 操作系统:Windows(XP)[I386, 32位, Console]
- 架构:386
- 模式:32位
- 类型:EXEC
- 字节序:LE
- 哈希值:
- MD5:4fd22bc6938254c2ba65fcc38f23d603
- SHA1:b388453c3a4aa0d3142ecebf4eb9637e6b9d559c
- SHA256:c2964f90a0d4ef70e0092aed526c482d9ab157ee3f59a40955f3e1087fbeee07
3. 加密机制分析
3.1 加密文件特征
- 加密文件名 = 原始文件名 + ".cry"(如:flag.txt.cry)
- 加密算法:AES-ECB模式
- 密钥生成:密钥内置于文件中
3.2 加密流程
- 初始异或加密:文件内容先进行异或0x9操作
- AES-ECB加密:使用内置密钥进行二次加密
4. 逆向分析过程
4.1 初步分析
- 使用DIE检测到VMP保护
- IDA分析发现堆栈保护相关函数,通过交叉引用定位入口点
4.2 脱壳与IAT修复
- 在x64dbg中下硬件断点定位入口点
- 使用Syscall插件修复IAT并转储文件
- IDA分析转储后的文件发现三个关键函数
4.3 进程注入分析
// 自解密字符串示例
for (i = 0; i < strlen(LibFileName); ++i)
LibFileName[i] ^= 1u;
// 获取系统文件夹路径
SHGetFolderPathA(0, 4 * Wow64Process + 37, 0, 0, pszPath);
// 创建svchost.exe进程并进行注入
CreateProcessA(0, pszPath, 0, 0, 0, 4u, 0, 0, v11, v13);
VirtualAllocEx(v13->hProcess, 0, 0x2000u, 0x3000u, 0x40u);
WriteProcessMemory(v13->hProcess, v14, Buffer, 0x34u, &NumberOfBytesWritten);
CreateRemoteThread(v13->hProcess, 0, 0, (LPTHREAD_START_ROUTINE)(v14 + 52), v14, 0, 0);
4.4 文件加密逻辑
// 文件读取与异或加密
if (!(*(int (__stdcall **)(int, char *, int, int *, _DWORD))(a1 + 4))(v3, v9, 32, &v11, 0)) {
v8 = v3;
(*(void (__stdcall **)(int))(a1 + 12))(v8);
return 0;
}
v5 = 0;
do
v9[v5++] ^= 9u;
while (v5 < strlen(v9));
4.5 PE文件释放
- 在x64dbg中对SizeofResource下硬件执行断点
- 提取大小为0xB800的资源
- 对资源进行异或解密得到PE文件
- 创建进程并注入解密后的PE文件
4.6 二次加密分析
// AES加密密钥
v4[0] = 370507323; // 0x16157E3B
v4[1] = -1496142280; // 0xA6D2AE38
v4[2] = -2011826245; // 0x8815F7BB
v4[3] = 1011863321; // 0x3C4FCF19
// 文件加密流程
sub_F21450(v3, 0, 16, v4, 0);
sub_F21930(v3, this);
sub_F21930(v3, this + 16);
5. 解密方法与Flag获取
5.1 解密步骤
-
提取AES密钥:
keys = bytes([0x3b, 0x7e, 0x15, 0x16, 0x38, 0xae, 0xd2, 0xa6, 0xbb, 0xf7, 0x15, 0x88, 0x19, 0xcf, 0x4f, 0x3c]) -
解密脚本:
from Crypto.Cipher import AES keys = bytes([0x3b, 0x7e, 0x15, 0x16, 0x38, 0xae, 0xd2, 0xa6, 0xbb, 0xf7, 0x15, 0x88, 0x19, 0xcf, 0x4f, 0x3c]) data = open('./flag.txt.cry', 'rb').read() aes = AES.new(keys, AES.MODE_ECB) honduras = aes.decrypt(data) decrypted_data = [] for i in honduras: decrypted_data.append(i ^ 9) print(bytes(decrypted_data))
5.2 获取Flag
- 解密结果:
b'wdflag{70O9TSGICPQSLGDC}\t\t\t\t\t\t\t\t' - 最终Flag:
wdflag{70O9TSGICPQSLGDC}
6. 技术总结
-
多层加密机制:
- 初始异或加密(XOR 0x9)
- AES-ECB二次加密
-
反分析技术:
- VMP保护
- 字符串动态解密(XOR 1)
- 进程注入(svchost.exe)
- 资源段隐藏PE文件
-
关键逆向技巧:
- 硬件断点定位入口点
- IAT修复与转储
- 资源段提取与分析
- 进程注入跟踪
-
解密要点:
- 识别AES密钥(硬编码)
- 了解加密顺序(先AES解密,再XOR解密)
- 处理填充数据(尾部制表符)
7. 防御建议
-
检测与预防:
- 监控异常进程创建(特别是svchost.exe)
- 检测可疑的文件操作(.cry扩展名)
- 阻止未知程序的资源访问
-
应急响应:
- 隔离受感染系统
- 分析内存中的注入代码
- 提取加密密钥进行文件恢复
-
加固措施:
- 限制进程注入权限
- 启用文件完整性监控
- 定期备份关键数据
本分析完整展示了从逆向分析到解密的完整过程,涵盖了现代勒索软件常见的技术手段及相应的对抗方法。