You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Mac M1的aarch64架构Ubuntu环境下编译Shellcode汇编报错求助

aarch64架构Ubuntu下汇编Shellcode编译异常解决方案

报错根因

  • 当前运行环境为aarch64(ARM64)架构,但使用的汇编代码、测试指令全为x86/x86_64平台专属语法,原生aarch64汇编器无法识别这些指令、寄存器命名,必然触发编译错误:
    • 报错日志中提到的mov rax,59、lea rdi,[rip+binsh]、syscall是x86_64 Linux的汇编写法
    • 待编译源码中的int $0x80、push %eax、mov %esp, %ebx是x86 32位Linux的汇编写法
    • 两类代码均不匹配aarch64指令集规范,和文件后缀(.s/.S)、使用的编译命令(gcc/as)无关,只要代码架构不兼容就会报错

编译实现步骤

1. 替换为aarch64适配的等价Shellcode汇编

将原x86架构代码替换为aarch64平台下实现execve("/bin/sh", NULL, NULL)的标准汇编代码,保存为shellcode.s即可:

.global _start
_start:
    adr x0, binsh       // 相对寻址取"/bin/sh"字符串地址存入x0寄存器
    mov x1, #0          // argv参数置空
    mov x2, #0          // envp参数置空
    mov x8, #221        // aarch64 Linux平台execve对应的系统调用号
    svc #0              // 触发系统调用
binsh:
    .asciz "/bin/sh"

aarch64汇编规范说明:通用寄存器命名为x0-x30,触发系统调用的指令为svc #0,系统调用号和参数传递规则与x86架构完全不同,无法通过配置汇编器直接兼容x86的旧代码。

2. 执行编译命令

当前系统为aarch64原生编译环境,无需额外添加交叉编译参数,直接执行以下命令即可完成编译:

  • 直接编译生成静态可执行文件:
    gcc -nostdlib -static shellcode.s -o shellcode-elf
  • 分步骤编译链接:
    as shellcode.s -o shellcode.o && ld shellcode.o -o shellcode-elf

常见注意事项

  • 无预处理逻辑的简单汇编代码,使用.s后缀即可正常编译,不需要强制修改为.S后缀触发额外的gcc预处理流程。
  • 如果需要提取纯Shellcode机器码,编译完成后执行objcopy -O binary shellcode-elf shellcode.bin即可导出,不需要修改汇编源码。

内容的提问来源于stack exchange,提问作者Seonghun Son

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 10:06:05