【发布时间】:2026-02-08 14:00:01
【问题描述】:
我试图在不使用标准库的情况下进入一些 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[] 传递到内核的帮助将不胜感激。
谢谢
【问题讨论】:
-
如果我将相关代码更改为
xor rsi, [esp + 4],strace 会显示一个基于 exec 的有用 argv,耶!然而,该程序随后出现段错误。传递空指针 (0) 允许 sh 正常运行。 -
以上内容应为
mov rsi, [esp+4] -
没关系,我完全错误地阅读 strace 并看着我执行测试。上面的代码实际上直接导致了段错误
标签: linux pointers assembly nasm system-calls