I am trying to get into a bit of Linux 64bit x86 assembly without using the standard libs, however I am having some issues dealing with arguments presented to my program (argv). I would think (based on documentation) that rsp
marks the beginning of the argc qword, whilst [rsp + 8]
would be argv. Unfortunately this is not the case, and the following (abridged) program causes 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
Help with regards to the amd64 calling convention and passing *char[]
into the kernel would be appreciated.
Thanks
At rsp+8
you'll find the address of a string with the program path. The pointer to the first argument is at [rsp+16]
. But for execve
you need a pointer to an array of pointer to strings which begins with a pointer to a program path (you can (ab)use [rsp+8]
).
So change
mov rsi, [rsp + 8]
to
lea rsi, [rsp + 8]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With