linux – x86_64程序集execve * char []系统调用

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

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,你需要一个指向字符串指针数组的指针,该指针以指向程序路径的指针开头(你可以(ab)使用[rsp 8]).

所以改变

mov rsi, [rsp + 8]

lea rsi, [rsp + 8]
点赞