trogne
trogne

Reputation: 3552

simplest way to pass arguments to execve syscall

Supposedly, it is very simple to pass arguments to an execve syscall.

In a tutorial, the instructor says it's only in one line, and leave this as an exercise.

The code below executes "ls" command. And I'm trying to execute something like "ls -la". After searching and searching, I still have no idea where to add the "-la" !

I know it's in the structure pointed to by the ecx register, and that it has to be null terminated. For now, ecx contains an address to /bin/ls . Should the arguments be another address ? argv is an array, with first element being "/bin/ls"...

global _start

section .text
_start:
        xor eax, eax
        push eax

        push 0x736c2f6e 
        push 0x69622f2f ; //bin/ls

        mov ebx, esp

        push eax
        mov edx, esp

        push ebx
        mov ecx, esp

        mov al, 11
        int 0x80

This is not working :

xor eax, eax
push eax
push 0x2a632020
push 0x736c2f6e 
push 0x69622f2f ; /bin/ls  c*
mov ecx, esp

Upvotes: 0

Views: 592

Answers (1)

Febriyanto Nugroho
Febriyanto Nugroho

Reputation: 563

You must save the -la argument in the ecx register and copy it to the esp register (I mean in the stack)

push eax
push byte 0x61
push word 0x6c2d 
mov ecx, esp ; -la

The following is your modified code :

global _start

section .text
_start:

xor eax, eax

push eax
push byte 0x61
push word 0x6c2d    
mov ecx, esp ; -la

push eax
push 0x736c2f6e
push 0x69622f2f ; //bin/ls
mov ebx, esp

push edx
push ecx
push ebx
mov ecx, esp

mov al, 11
int 0x80

The code working fine :)

% ./list
total 4
-rwxrwxr-x 1 febri febri 512 Oct  5 07:45 list
% 

Upvotes: 2

Related Questions