在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
相关产品推荐
相关产品推荐

