记一次攻防样本——shellcode分析
字数 1450 2025-08-20 18:18:04

Shellcode分析与反射式DLL注入技术详解

0x01 背景知识

本文详细分析了一种高级shellcode实现技术,该技术主要用于反射式DLL注入,具有以下特点:

  • 隐藏PE文件在shellcode中
  • 使用多种反检测技术
  • 动态解密关键数据
  • 巧妙利用PE头废弃字段

0x02 Shellcode结构分析

一、整体结构

该shellcode主要包含以下几个部分:

  1. 头部垃圾代码(用于混淆)
  2. 核心加载器代码
  3. 隐藏的PE文件(DLL)
  4. 配置数据(存储在PE头废弃字段中)

二、关键函数调用流程

  1. 初始函数调用

    • CreatFileMappingA
    • MapViewOfFile
    • VirtualProtect
  2. PE文件处理流程

    sub_188e6 (主加载函数)
      ├─ sub_18c66 (查找隐藏PE)
      ├─ sub_18cf6 (获取API地址)
      ├─ sub_19096 (初始化函数指针)
      ├─ sub_19396 (内存分配)
      ├─ sub_194b6 (PE头处理)
      ├─ sub_19576 (节区复制)
      ├─ sub_19676 (导入表处理)
      └─ sub_19456 (内存权限设置)
    

0x03 关键技术点详解

一、PE文件隐藏技术

  1. 特征修改

    • DOS头特征从"MZ"修改为"YA"
    • PE头特征从"PE"修改为"QJ"
  2. 查找算法

    for(i = start_addr; ; i--) {
        if(*(WORD*)i == 'YA' && 
           *(i+0x3c)0x40-0x400之间 && 
           *(WORD*)(i + *(i+0x3c)) == 'JQ') {
            return i; // 找到PE起始位置
        }
    }
    

二、动态API解析技术

  1. PEB遍历

    • 通过__readgsqword(0x60)获取PEB
    • 遍历LDR链表查找模块
  2. 特征码计算

    // 计算DLL名称特征码
    for(每个字符) {
        hash = ROR(hash, 13);
        hash += toupper(当前字符);
    }
    // 目标特征码:0x6A4ABC5B (对应kernel32.dll)
    
  3. 导出表解析

    • 遍历导出名称表计算特征码
    • 匹配预定义特征码获取函数地址

三、内存分配技术

  1. 替代VirtualAlloc

    hMapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, 0x40, 0, size, NULL);
    pMemory = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, size);
    
  2. 权限控制

    • 使用PE头CharacteristicsIMAGE_FILE_BYTES_REVERSED_HI位作为配置
    • 值为1:申请RWX内存
    • 值为0:先申请RW内存,后改为RX

四、PE加载技术

  1. PE头处理

    • 复制隐藏PE头到分配的内存
    • 清除PE头特征(当IMAGE_FILE_RELOCS_STRIPPED为1时)
  2. 节区处理

    • 遍历节表复制各节区
    • 记录可执行节区的RVA和大小
  3. 导入表解密

    // 解密算法(异或)
    for(每个字节) {
        decrypted[i] = encrypted[i] ^ key[i % 4];
    }
    // key来自PE头的NumberOfSymbols字段
    
  4. 重定位修复

    • 使用原始PE的重定位表修复内存中的PE

五、反检测技术

  1. 代码混淆

    • 头部插入垃圾代码
    • 消除call/pop特征
  2. 数据隐藏

    • 加密导入表名称
    • 加密可执行节区代码
  3. 配置存储

    • 使用PE头废弃字段存储配置:
      • NumberOfSymbols:解密密钥
      • TimeDateStampPointerToSymbolTable:函数偏移
      • Characteristics:内存权限控制

0x04 CobaltStrike特征分析

该shellcode最终被确认为CobaltStrike的反射加载器,具有以下特征:

  1. 初始化流程

    • 计算security cookie
    • 获取系统信息(时间戳、进程/线程ID)
  2. DLL入口调用

    • 首次调用:初始化(fdwReason=1)
    • 二次调用:执行主逻辑(fdwReason=4)
  3. 配置对应

    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 防御检测建议

针对此类技术的防御措施:

  1. 内存监控

    • 监控CreateFileMapping/MapViewOfFile的异常使用
    • 检测RW->RX权限变更
  2. 特征检测

    • 检测"YA"、"JQ"特征组合
    • 监控PE头废弃字段异常使用
  3. 行为检测

    • 反射加载行为
    • 异常DLL入口调用序列
  4. 流量分析

    • 检测C2通信特征
    • 识别域名前置技术

0x06 总结

本文详细分析了一种高级shellcode实现技术,揭示了反射式DLL注入的内部机制和反检测技术。关键要点包括:

  1. 巧妙利用PE结构实现数据隐藏
  2. 多种内存分配技术绕过监控
  3. 动态解密和配置管理
  4. 与CobaltStrike实现的对应关系

理解这些技术有助于提升攻防两端的技能水平,在红队操作中实现更隐蔽的驻留,在蓝队防御中建立更有效的检测机制。

Shellcode分析与反射式DLL注入技术详解 0x01 背景知识 本文详细分析了一种高级shellcode实现技术,该技术主要用于反射式DLL注入,具有以下特点: 隐藏PE文件在shellcode中 使用多种反检测技术 动态解密关键数据 巧妙利用PE头废弃字段 0x02 Shellcode结构分析 一、整体结构 该shellcode主要包含以下几个部分: 头部垃圾代码(用于混淆) 核心加载器代码 隐藏的PE文件(DLL) 配置数据(存储在PE头废弃字段中) 二、关键函数调用流程 初始函数调用 : CreatFileMappingA MapViewOfFile VirtualProtect PE文件处理流程 : 0x03 关键技术点详解 一、PE文件隐藏技术 特征修改 : DOS头特征从"MZ"修改为"YA" PE头特征从"PE"修改为"QJ" 查找算法 : 二、动态API解析技术 PEB遍历 : 通过 __readgsqword(0x60) 获取PEB 遍历LDR链表查找模块 特征码计算 : 导出表解析 : 遍历导出名称表计算特征码 匹配预定义特征码获取函数地址 三、内存分配技术 替代VirtualAlloc : 权限控制 : 使用PE头 Characteristics 的 IMAGE_FILE_BYTES_REVERSED_HI 位作为配置 值为1:申请RWX内存 值为0:先申请RW内存,后改为RX 四、PE加载技术 PE头处理 : 复制隐藏PE头到分配的内存 清除PE头特征(当 IMAGE_FILE_RELOCS_STRIPPED 为1时) 节区处理 : 遍历节表复制各节区 记录可执行节区的RVA和大小 导入表解密 : 重定位修复 : 使用原始PE的重定位表修复内存中的PE 五、反检测技术 代码混淆 : 头部插入垃圾代码 消除call/pop特征 数据隐藏 : 加密导入表名称 加密可执行节区代码 配置存储 : 使用PE头废弃字段存储配置: NumberOfSymbols :解密密钥 TimeDateStamp 和 PointerToSymbolTable :函数偏移 Characteristics :内存权限控制 0x04 CobaltStrike特征分析 该shellcode最终被确认为CobaltStrike的反射加载器,具有以下特征: 初始化流程 : 计算security cookie 获取系统信息(时间戳、进程/线程ID) DLL入口调用 : 首次调用:初始化(fdwReason=1) 二次调用:执行主逻辑(fdwReason=4) 配置对应 : 0x05 防御检测建议 针对此类技术的防御措施: 内存监控 : 监控CreateFileMapping/MapViewOfFile的异常使用 检测RW->RX权限变更 特征检测 : 检测"YA"、"JQ"特征组合 监控PE头废弃字段异常使用 行为检测 : 反射加载行为 异常DLL入口调用序列 流量分析 : 检测C2通信特征 识别域名前置技术 0x06 总结 本文详细分析了一种高级shellcode实现技术,揭示了反射式DLL注入的内部机制和反检测技术。关键要点包括: 巧妙利用PE结构实现数据隐藏 多种内存分配技术绕过监控 动态解密和配置管理 与CobaltStrike实现的对应关系 理解这些技术有助于提升攻防两端的技能水平,在红队操作中实现更隐蔽的驻留,在蓝队防御中建立更有效的检测机制。