Ste*_*e M 5 x86 assembly x86-64 gnu-assembler ubuntu-14.04
我是 64 位 x86 编码新手,但我运行的是 Ubuntu 14.04(可靠),并且我有一段非常简单的 64 位代码,我使用as进行汇编。我得到的输出具有奇怪的权限和文件类型。
当我跑步时:
as file.s
Run Code Online (Sandbox Code Playgroud)
我得到一个具有 770 权限的文件a.out。
当我执行它时,我得到这个错误:
bash: ./a.out: 无法执行二进制文件: Exec 格式错误
当我跑步时:
file ./a.out
Run Code Online (Sandbox Code Playgroud)
我得到:
./a.out:ELF 64 位 LSB 可重定位,x86-64,版本 1 (SYSV),未剥离
我使用的汇编代码是:
.section .data
.LC0:
.string "/bin/sh"
.LC1:
.string "/bin/sh"
.LC3:
.quad .LC1, 0
.text
.globl _start
_start:
.LFB0:
pushq %rbp
movq %rsp, %rbp
movq $59,%rax # System Call to execve
movq $.LC0, %rdi # Pass program to execute
movq $.LC3, %rsi # Pass command line arguments
syscall
movl $0, %eax
popq %rbp
ret
Run Code Online (Sandbox Code Playgroud)
您想首先使用 GNU 汇编器 ( AS )汇编程序,然后使用链接器生成最终的可执行文件。为此,您应该能够使用以下内容:
as file.s -o file.o
ld file.o -o file
Run Code Online (Sandbox Code Playgroud)
第一个命令告诉汇编器输出使用该选项调用的ELF64对象。第二个命令链接到使用该选项调用的 64 位 ELF 可执行文件。file.o-ofile.ofile-o
64 位系统上的典型默认行为是汇编器和链接器生成 64 位对象和可执行文件。
然后您可以使用以下命令运行它:
./file
Run Code Online (Sandbox Code Playgroud)