猫执行NASM

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

我正在尝试使用

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

assembly nasm system-calls
1个回答
0
投票

这是一个 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
© www.soinside.com 2019 - 2024. All rights reserved.