记一次攻防样本——shellcode分析
字数 1450 2025-08-20 18:18:04
Shellcode分析与反射式DLL注入技术详解
0x01 背景知识
本文详细分析了一种高级shellcode实现技术,该技术主要用于反射式DLL注入,具有以下特点:
- 隐藏PE文件在shellcode中
- 使用多种反检测技术
- 动态解密关键数据
- 巧妙利用PE头废弃字段
0x02 Shellcode结构分析
一、整体结构
该shellcode主要包含以下几个部分:
- 头部垃圾代码(用于混淆)
- 核心加载器代码
- 隐藏的PE文件(DLL)
- 配置数据(存储在PE头废弃字段中)
二、关键函数调用流程
-
初始函数调用:
CreatFileMappingAMapViewOfFileVirtualProtect
-
PE文件处理流程:
sub_188e6 (主加载函数) ├─ sub_18c66 (查找隐藏PE) ├─ sub_18cf6 (获取API地址) ├─ sub_19096 (初始化函数指针) ├─ sub_19396 (内存分配) ├─ sub_194b6 (PE头处理) ├─ sub_19576 (节区复制) ├─ sub_19676 (导入表处理) └─ sub_19456 (内存权限设置)
0x03 关键技术点详解
一、PE文件隐藏技术
-
特征修改:
- DOS头特征从"MZ"修改为"YA"
- PE头特征从"PE"修改为"QJ"
-
查找算法:
for(i = start_addr; ; i--) { if(*(WORD*)i == 'YA' && *(i+0x3c)在0x40-0x400之间 && *(WORD*)(i + *(i+0x3c)) == 'JQ') { return i; // 找到PE起始位置 } }
二、动态API解析技术
-
PEB遍历:
- 通过
__readgsqword(0x60)获取PEB - 遍历LDR链表查找模块
- 通过
-
特征码计算:
// 计算DLL名称特征码 for(每个字符) { hash = ROR(hash, 13); hash += toupper(当前字符); } // 目标特征码:0x6A4ABC5B (对应kernel32.dll) -
导出表解析:
- 遍历导出名称表计算特征码
- 匹配预定义特征码获取函数地址
三、内存分配技术
-
替代VirtualAlloc:
hMapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, 0x40, 0, size, NULL); pMemory = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, size); -
权限控制:
- 使用PE头
Characteristics的IMAGE_FILE_BYTES_REVERSED_HI位作为配置 - 值为1:申请RWX内存
- 值为0:先申请RW内存,后改为RX
- 使用PE头
四、PE加载技术
-
PE头处理:
- 复制隐藏PE头到分配的内存
- 清除PE头特征(当
IMAGE_FILE_RELOCS_STRIPPED为1时)
-
节区处理:
- 遍历节表复制各节区
- 记录可执行节区的RVA和大小
-
导入表解密:
// 解密算法(异或) for(每个字节) { decrypted[i] = encrypted[i] ^ key[i % 4]; } // key来自PE头的NumberOfSymbols字段 -
重定位修复:
- 使用原始PE的重定位表修复内存中的PE
五、反检测技术
-
代码混淆:
- 头部插入垃圾代码
- 消除call/pop特征
-
数据隐藏:
- 加密导入表名称
- 加密可执行节区代码
-
配置存储:
- 使用PE头废弃字段存储配置:
NumberOfSymbols:解密密钥TimeDateStamp和PointerToSymbolTable:函数偏移Characteristics:内存权限控制
- 使用PE头废弃字段存储配置:
0x04 CobaltStrike特征分析
该shellcode最终被确认为CobaltStrike的反射加载器,具有以下特征:
-
初始化流程:
- 计算security cookie
- 获取系统信息(时间戳、进程/线程ID)
-
DLL入口调用:
- 首次调用:初始化(fdwReason=1)
- 二次调用:执行主逻辑(fdwReason=4)
-
配置对应:
stage { set userwx "true" // 避免申请RWX权限 set allocator "MapViewOFFile" // 使用MapViewOfFile分配内存 set cleanup "true" // 清理痕迹 set magic_mz_x64 "YA" // 修改DOS头特征 set magic_pe "JQ" // 修改PE头特征 set obuscate "true" // 混淆导入表 set stomppe "true" // 清除内存中PE头特征 }
0x05 防御检测建议
针对此类技术的防御措施:
-
内存监控:
- 监控CreateFileMapping/MapViewOfFile的异常使用
- 检测RW->RX权限变更
-
特征检测:
- 检测"YA"、"JQ"特征组合
- 监控PE头废弃字段异常使用
-
行为检测:
- 反射加载行为
- 异常DLL入口调用序列
-
流量分析:
- 检测C2通信特征
- 识别域名前置技术
0x06 总结
本文详细分析了一种高级shellcode实现技术,揭示了反射式DLL注入的内部机制和反检测技术。关键要点包括:
- 巧妙利用PE结构实现数据隐藏
- 多种内存分配技术绕过监控
- 动态解密和配置管理
- 与CobaltStrike实现的对应关系
理解这些技术有助于提升攻防两端的技能水平,在红队操作中实现更隐蔽的驻留,在蓝队防御中建立更有效的检测机制。