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

问题描述 投票:0回答:1

我试图在不使用标准库的情况下了解一些 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[]
传递到内核的帮助将不胜感激。

linux assembly x86-64 nasm execve
1个回答
3
投票

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

所以改变

mov rsi, [rsp + 8]

lea rsi, [rsp + 8]
© www.soinside.com 2019 - 2024. All rights reserved.