x86_64程序集execve * char 系统调用

我试图进入一些Linux 64位x86程序集,而不使用标准的库,但是我有一些问题处理提交给我的程序(argv)的参数。 我会认为(基于文档) rsp标志着argc qword的开始,而[rsp + 8]将是argv。 不幸的是,情况并非如此,下面的(删节的)程序会导致EFAULT (Bad address)

 sys_execve equ 59 sys_exit equ 60 section .data child db "/bin/sh", 0 global _start section .text _start: mov rdi, child ; #1 filename mov rsi, [rsp + 8] ; #2 argv mov rdx, 0 ; #3 envp = 0 mov rax, sys_execve ; execve syscall mov rax, rdi ; #1 Return value mov rax, sys_exit ; exit syscall 

关于amd64调用约定的帮助和传递*char[]到内核​​将不胜感激。

谢谢

rsp+8你可以找到程序路径的字符串地址。 指向第一个参数的指针位于[rsp+16] 。 但是对于execve你需要一个指向字符串指针数组的指针,该指针以一个指向程序路径的指针开始(你可以使用[rsp+8] )。

所以改变

 mov rsi, [rsp + 8] 

 lea rsi, [rsp + 8]