Assembly 如何正确使用汇编程序中的execve系统调用?

Assembly 如何正确使用汇编程序中的execve系统调用?,assembly,x86-64,system-calls,Assembly,X86 64,System Calls,我的代码: section .data binsh: db "/bin/sh" section .text global start start mov rax, 59 ; move syscall execve (59) to rax mov rdi, binsh ; command mov rsi, 0 ; argv mov rdx, 0 ; envp int 0x80 mov rax, 60 ; move syscall exit

我的代码:

section .data
    binsh: db "/bin/sh"

section .text
global start
start
    mov rax, 59 ; move syscall execve (59) to rax
    mov rdi, binsh ; command
    mov rsi, 0 ; argv
    mov rdx, 0 ; envp
    int 0x80
    mov rax, 60 ; move syscall exit (60) to rax
    mov rdi, 0 ; exit 0
    int 0x80
这不起作用,因为我不知道如何使用execve系统调用。
strace
显示:

execve("./first_assembler", ["./first_assembler"], [/* 67 vars */]) = 0
execve("/bin/sh", NULL, NULL)           = -1 EFAULT (Bad address)
exit(0)                                 = ?
<... exit resumed> strace: _exit returned!
)                    = ?
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0} ---
+++ killed by SIGSEGV (core dumped) +++
execve(“./first\u assembler”、[“/first\u assembler”]、[/*67 vars*/])=0
execve(“/bin/sh”,NULL,NULL)=-1默认值(错误地址)
出口(0)=?
斯特拉斯:你的出口回来了!
)                    = ?
---SIGSEGV{si_signo=SIGSEGV,si_code=SEGV_MAPERR,si_addr=0}---
+++被SIGSEGV杀死(堆芯倾倒)+++

execve syscall的正确用法是什么?

并查看为什么在64位代码中使用
syscall
而不是
int 0x80
(正如我发布的第一个链接也提到的)。您正确地使用了64位呼叫号码和注册,但是调用了32位
int0x80
ABI,而不是64位
syscall
ABI
strace
解码错误;实际上,您使用EBX、ECX和EDX中的非指针进行了一个
\uuu NR\uOldUname
系统调用。请参阅为什么您应该在64位代码中使用
syscall
而不是
int 0x80
(我发布的第一个链接也提到了这一点)。您正确地使用了64位调用号和寄存器,但是调用了32位
int0x80
ABI,而不是64位
syscall
ABI
strace
解码错误;实际上,您使用EBX、ECX和EDX中的非指针进行了一个
\uu NR\uOldUname
系统调用。