我试图在不使用标准库的情况下进入一些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[]
传递到内核中将不胜感激。
由于
答案 0 :(得分:2)
在rsp+8
,您将找到包含程序路径的字符串的地址。指向第一个参数的指针位于[rsp+16]
。但对于execve
,您需要一个指向字符串指针数组的指针,该指针以指向程序路径的指针开头(您可以(ab)使用[rsp+8]
)。
所以改变
mov rsi, [rsp + 8]
到
lea rsi, [rsp + 8]