手工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文件:
- 打开目标程序
- 在区段表底部添加新节标题(如".demo")
- 设置虚拟大小和原始大小为1000h(4096字节)
- 设置区段属性为可读、可写、可执行(RWE)
- 保存文件
2. 填充新区段
由于新区段为空,程序无法运行,需要:
- 使用十六进制编辑器在文件末尾添加1000h个00字节
- 保存并验证程序能否正常运行
3. 劫持执行流程
使用Ollydbg进行调试:
- 查看内存映射,确认.demo段已添加
- 复制程序前3个操作码(用于后续恢复)
- 修改程序起始代码为
JMP 00412000(.demo段地址) - 保存修改
4. 注入Shellcode
- 使用msfvenom生成Shellcode:
msfvenom -p windows/messagebox text="it's demo" -f hex - 在Ollydbg中选中.demo段的00区域
- 右键 > 二进制 > 二进制粘贴Shellcode
5. 恢复执行流程
- 修改Shellcode最后指令为nop
- 添加
popfd, popad恢复堆栈 - 添加原始程序的前3个操作码
- 跳转回原始执行地址
- 保存文件
方法二:利用代码空洞
1. 查找代码空洞
使用cave_miner工具扫描目标程序:
cave_miner search /path/to/exe
# 可用--size参数筛选合适大小的空洞
2. 修改内存权限
使用LordPE工具:
- 找到包含空洞的区段
- 修改区段属性为可读、可写、可执行(RWE)
3. 注入Shellcode
- 记下空洞的虚拟地址(如0041123d)
- 修改程序起始代码为
JMP 0041123d - 在Ollydbg中定位到空洞地址
- 粘贴Shellcode到空洞中
4. 恢复执行流程
- 修改Shellcode最后指令为nop
- 添加
popfd, popad恢复堆栈 - 跳转回原始执行地址
- 保存文件
0x04 技术要点总结
- 保持文件大小:使用代码空洞技术可避免增加文件大小
- 执行流劫持:需要精确控制跳转和返回地址
- 环境恢复:必须正确恢复寄存器状态和堆栈
- 权限设置:确保Shellcode所在区段有执行权限
- Shellcode大小:需匹配目标空洞或新区段的大小
0x05 防御建议
- 启用ASLR和DEP等内存保护机制
- 使用数字签名验证文件完整性
- 监控程序异常行为(如突然出现新区段)
- 定期检查关键程序的PE结构变化
通过以上方法,可以实现对PE文件的手工Shellcode注入,同时保持程序原有功能和隐蔽性。