手工shellcode注入PE文件
字数 1289 2025-08-25 22:58:20

手工Shellcode注入PE文件技术详解

0x01 技术概述

手工Shellcode注入PE文件是一种高级渗透测试技术,它允许我们将自定义的Shellcode注入到合法的可执行文件中,同时保持以下特性:

  • 文件大小保持不变(使用代码空洞技术时)
  • 程序原有功能不受影响
  • Shellcode不经过编码器混淆
  • 难以被安全软件检测

0x02 ASLR检查

ASLR(地址空间布局随机化)是一种安全保护技术,会随机化内存布局,增加攻击难度。在注入前需要检查目标程序是否启用了ASLR。

检查工具推荐:

  • PESecurity脚本(GitHub地址:https://github.com/NetSPI/PESecurity)

0x03 实现方法

方法一:添加新区段

1. 创建新区段

使用LordPE工具修改PE文件:

  1. 打开目标程序
  2. 在区段表底部添加新节标题(如".demo")
  3. 设置虚拟大小和原始大小为1000h(4096字节)
  4. 设置区段属性为可读、可写、可执行(RWE)
  5. 保存文件

2. 填充新区段

由于新区段为空,程序无法运行,需要:

  1. 使用十六进制编辑器在文件末尾添加1000h个00字节
  2. 保存并验证程序能否正常运行

3. 劫持执行流程

使用Ollydbg进行调试:

  1. 查看内存映射,确认.demo段已添加
  2. 复制程序前3个操作码(用于后续恢复)
  3. 修改程序起始代码为JMP 00412000(.demo段地址)
  4. 保存修改

4. 注入Shellcode

  1. 使用msfvenom生成Shellcode:
    msfvenom -p windows/messagebox text="it's demo" -f hex
    
  2. 在Ollydbg中选中.demo段的00区域
  3. 右键 > 二进制 > 二进制粘贴Shellcode

5. 恢复执行流程

  1. 修改Shellcode最后指令为nop
  2. 添加popfd, popad恢复堆栈
  3. 添加原始程序的前3个操作码
  4. 跳转回原始执行地址
  5. 保存文件

方法二:利用代码空洞

1. 查找代码空洞

使用cave_miner工具扫描目标程序:

cave_miner search /path/to/exe
# 可用--size参数筛选合适大小的空洞

2. 修改内存权限

使用LordPE工具:

  1. 找到包含空洞的区段
  2. 修改区段属性为可读、可写、可执行(RWE)

3. 注入Shellcode

  1. 记下空洞的虚拟地址(如0041123d)
  2. 修改程序起始代码为JMP 0041123d
  3. 在Ollydbg中定位到空洞地址
  4. 粘贴Shellcode到空洞中

4. 恢复执行流程

  1. 修改Shellcode最后指令为nop
  2. 添加popfd, popad恢复堆栈
  3. 跳转回原始执行地址
  4. 保存文件

0x04 技术要点总结

  1. 保持文件大小:使用代码空洞技术可避免增加文件大小
  2. 执行流劫持:需要精确控制跳转和返回地址
  3. 环境恢复:必须正确恢复寄存器状态和堆栈
  4. 权限设置:确保Shellcode所在区段有执行权限
  5. Shellcode大小:需匹配目标空洞或新区段的大小

0x05 防御建议

  1. 启用ASLR和DEP等内存保护机制
  2. 使用数字签名验证文件完整性
  3. 监控程序异常行为(如突然出现新区段)
  4. 定期检查关键程序的PE结构变化

通过以上方法,可以实现对PE文件的手工Shellcode注入,同时保持程序原有功能和隐蔽性。

手工Shellcode注入PE文件技术详解 0x01 技术概述 手工Shellcode注入PE文件是一种高级渗透测试技术,它允许我们将自定义的Shellcode注入到合法的可执行文件中,同时保持以下特性: 文件大小保持不变(使用代码空洞技术时) 程序原有功能不受影响 Shellcode不经过编码器混淆 难以被安全软件检测 0x02 ASLR检查 ASLR(地址空间布局随机化)是一种安全保护技术,会随机化内存布局,增加攻击难度。在注入前需要检查目标程序是否启用了ASLR。 检查工具推荐: PESecurity脚本(GitHub地址:https://github.com/NetSPI/PESecurity) 0x03 实现方法 方法一:添加新区段 1. 创建新区段 使用LordPE工具修改PE文件: 打开目标程序 在区段表底部添加新节标题(如".demo") 设置虚拟大小和原始大小为1000h(4096字节) 设置区段属性为可读、可写、可执行(RWE) 保存文件 2. 填充新区段 由于新区段为空,程序无法运行,需要: 使用十六进制编辑器在文件末尾添加1000h个00字节 保存并验证程序能否正常运行 3. 劫持执行流程 使用Ollydbg进行调试: 查看内存映射,确认.demo段已添加 复制程序前3个操作码(用于后续恢复) 修改程序起始代码为 JMP 00412000 (.demo段地址) 保存修改 4. 注入Shellcode 使用msfvenom生成Shellcode: 在Ollydbg中选中.demo段的00区域 右键 > 二进制 > 二进制粘贴Shellcode 5. 恢复执行流程 修改Shellcode最后指令为nop 添加 popfd, popad 恢复堆栈 添加原始程序的前3个操作码 跳转回原始执行地址 保存文件 方法二:利用代码空洞 1. 查找代码空洞 使用cave_ miner工具扫描目标程序: 2. 修改内存权限 使用LordPE工具: 找到包含空洞的区段 修改区段属性为可读、可写、可执行(RWE) 3. 注入Shellcode 记下空洞的虚拟地址(如0041123d) 修改程序起始代码为 JMP 0041123d 在Ollydbg中定位到空洞地址 粘贴Shellcode到空洞中 4. 恢复执行流程 修改Shellcode最后指令为nop 添加 popfd, popad 恢复堆栈 跳转回原始执行地址 保存文件 0x04 技术要点总结 保持文件大小 :使用代码空洞技术可避免增加文件大小 执行流劫持 :需要精确控制跳转和返回地址 环境恢复 :必须正确恢复寄存器状态和堆栈 权限设置 :确保Shellcode所在区段有执行权限 Shellcode大小 :需匹配目标空洞或新区段的大小 0x05 防御建议 启用ASLR和DEP等内存保护机制 使用数字签名验证文件完整性 监控程序异常行为(如突然出现新区段) 定期检查关键程序的PE结构变化 通过以上方法,可以实现对PE文件的手工Shellcode注入,同时保持程序原有功能和隐蔽性。