8-BitQuest
菜单
[逆向工程]

Shellcode 转可执行程序:从二进制代码到 EXE 的转换实战

· 1 分钟阅读 · @admin

Shellcode 编译成可执行程序的像素封面

在恶意软件分析和漏洞利用研究中,我们经常需要将 Shellcode(独立的机器码片段)转换为可执行程序。这种转换技术在安全研究中具有重要意义:

  • 动态调试:将 Shellcode 转换为可执行文件后,可以使用调试器(如 x64dbg、OllyDbg)进行单步调试
  • 行为分析:在沙箱环境中运行,观察其系统调用、网络通信等行为特征
  • 功能验证:快速测试 Shellcode 的功能是否符合预期

本文将介绍如何使用 YASM 汇编器和 GoLink 链接器将 Shellcode 编译成 Windows 可执行文件(PE 格式)的完整流程。

转换步骤详解

步骤一:创建汇编包装文件

首先,我们需要创建一个汇编源文件(例如 shellcode.asm),作为 Shellcode 的入口点包装器:

Global Start
SECTION 'AyyLmao' write, execute, read
Start:
  incbin "shellcode.bin"

代码结构说明

  • Global Start:声明全局符号 Start 作为程序入口点,链接器将使用该符号确定程序的起始地址
  • SECTION 'AyyLmao' write, execute, read:定义一个自定义代码段,具备读(read)、写(write)、执行(execute)三种内存权限
    • 段名 'AyyLmao' 可自定义,不影响功能(建议使用有意义的名称如 .text 或 .code)
    • 权限设置为 RWX(可读可写可执行),确保 Shellcode 能够正常执行,同时支持自修改代码(Self-Modifying Code)
  • Start::定义入口点标签,对应程序执行的第一条指令
  • incbin "shellcode.bin":使用 incbin(include binary)汇编指令,将二进制文件 shellcode.bin 的原始字节直接嵌入到当前位置

注意事项

  • 确保 shellcode.bin 文件与 shellcode.asm 在同一目录下,或使用绝对路径
  • Shellcode 必须是位置无关代码(Position Independent Code, PIC),否则可能因地址错误而执行失败

步骤二:使用 YASM 编译汇编文件

使用 YASM(Yet Another assembler)将汇编源文件编译为目标文件(.obj):

yasm -f win32 shellcode.asm -o shellcode.obj

参数说明

  • -f win32:指定输出格式为 Windows 32 位目标文件(COFF 格式)
    • 对于 64 位 Shellcode,使用 -f win64
  • shellcode.asm:输入的汇编源文件
  • -o shellcode.obj:输出的目标文件名

使用 GoLink 链接器将目标文件链接为可执行程序:

golink /entry Start /ni shellcode.obj

参数说明

  • /entry Start:指定程序入口点为 Start 符号
  • /ni:No Import 选项,表示不导入任何系统库(适用于自包含的 Shellcode)
  • shellcode.obj:输入的目标文件

执行成功后,将生成 shellcode.exe 可执行文件。

实战提示

权限与兼容性

  • DEP(数据执行保护):现代操作系统默认启用 DEP,确保代码段具有执行权限
  • ASLR(地址空间布局随机化):如果 Shellcode 依赖固定地址,需要在测试环境中禁用 ASLR

调试建议

  • 使用 x64dbg 或 IDA Pro 加载生成的 EXE 文件
  • 在入口点设置断点,逐步分析 Shellcode 的执行流程
  • 监控 API 调用、内存操作等关键行为

更多文章