我是编码64位x86的新手,但我正在运行Ubuntu 14.04(可靠),我有一个非常简单的64位代码,我使用作为组装。我得到的输出具有奇怪的权限和文件类型。
当我跑步时:
as file.s
我获得了一个拥有770权限的文件a.out
。
执行时出现此错误:
bash:./ a.out:无法执行二进制文件:exec格式错误
当我跑步时:
file ./a.out
我明白了:
./ 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
答案 0 :(得分:1)
您希望首先使用GNU Assembler( AS )组装程序,然后使用链接器生成最终的可执行文件。要做到这一点,你应该可以使用类似的东西:
as file.s -o file.o
ld file.o -o file
第一个命令告诉汇编器使用file.o
选项输出名为-o
的 ELF64 对象。第二个命令使用file.o
选项将file
链接到名为-o
的64位ELF可执行文件。
64位系统上的典型默认行为是汇编器和链接器生成64位对象和可执行文件。
然后您可以使用以下命令运行它:
./file