Cristi
Cristi

Reputation: 1255

NASM getting args and calling sys_execve

I'm trying to write a program that takes two arguments : the path of an executable file and the parameter to launch that executable with. Example:

$ ./program /bin/ping 127.0.0.1

But the code I wrote does not seem to do anything, can you please tell me what am I doing wrong?

global main

section .text
main:
  push ebp
  mov ebp, esp
check_argc:
  mov eax, [ebp + 8] ; eax <- argc
  cmp eax, 1
  jg do_execve
  jmp done
do_execve:
  mov eax,11 ; linux system call number (11) - sys_execve
  mov ebx,[ebp+12] ; ebx <- argv[1]
  lea ecx,[ebp+12] ; ebx <- &argv[1]
  mov edx,0
  int 0x80
done:
  leave
  ret

EDIT:

For compilation I used:

$ nasm -f elf32 program.asm

$ gcc -lc -m32 program.o -o program.exe

The "check_argc" part seems to work, I checked it with puts.

Upvotes: 0

Views: 401

Answers (1)

user786653
user786653

Reputation: 30460

You problem lies here:

  mov ebx,[ebp+12] ; ebx <- argv[1]
  lea ecx,[ebp+12] ; ebx <- &argv[1]

The C prototype of main is: int main(int argc, char** argv), so what you're doing is actually:

  mov ebx,[ebp+12] ; ebx <- argv = &argv[0]
  lea ecx,[ebp+12] ; ecx <- &argv

What you want to do is something like the following:

  mov ecx, [ebp+12] ; ecx <- &argv[0]
  add ecx, 4        ; ecx <- &argv[1]
  mov ebx, [ecx]    ; ebx <- argv[1]

Upvotes: 1

Related Questions