我正在尝试使用
cat
和 execve
系统调用在 Assembly 中输出文件,但我遇到了一些麻烦,我不知道为什么。
section .text
global _start
_start:
mov al, 59 ; Syscall number
xor rdx, rdx ; No enviornment variables
push rdx
; Add arg1
mov rdi, "/bin/cat"
push rdi
mov rdi, rsp
push rdx
; Add arg2
mov si, "xt"
push rsi
mov rsi, "//file.t"
push rsi
mov rsi, rsp
; Call execve
syscall
我检查过以确保
/file.txt
存在。然后在系统调用完成之前用 GDB 查看堆栈,一切看起来也都是正确的:
0x00007fffc25f8628│+0x0000: "//file.txt" ← $rsp, $rsi
0x00007fffc25f8630│+0x0008: 0x0000000000007478 ("xt"?)
0x00007fffc25f8638│+0x0010: 0x0000000000000000
0x00007fffc25f8640│+0x0018: "/bin/cat" ← $rdi
如何正确拨打
execve
?
这是一个 64 位示例,它运行带参数的外部命令,这对我有用。
; ---------------------------------------------------------
; Executes external command
; ---------------------------------------------------------
SECTION .data
; Important: The strings must be null-terminated
bin db '/usr/bin/nano',0x0
arg1 db '-w', 0x0
arg2 db '/etc/fstab', 0x0
args dq arg1, arg2, 0x0
SECTION .text
global _start
_start:
; Involke SYS_EXECVE
mov rax, 59
mov rdi, bin
mov rsi, args
xor rdx, rdx ; envp[] is not used
syscall
mov rax, 60
mov rdi, 0
syscall