Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

execve() failing to launch program in C

I am trying to spawn a new process using execve() from unistd.h on Linux. I have tried passing it the following parameters execve("/bin/ls", "/bin/ls", NULL); but get no result. I do not get an error either, the program just exits. Is there a reason why this is happening? I have tried launching it as root and regular user. The reason I need to use execve() is because I am trying to get it to work in an assembly call like so

program: db "/bin/ls",0

mov eax, 0xb
mov ebx, program
mov ecx, program
mov edx, 0
int 0x80

Thank you!

like image 988
user99545 Avatar asked Sep 03 '26 14:09

user99545


2 Answers

The arguments that you're passing to execve are wrong. Both the second and third must be an array of char pointers with a NULL sentinel value, not a single pointer.

In other words, something like:

#include <unistd.h>
int main (void) {
    char * const argv[] = {"/bin/ls", NULL};
    char * const envp[] = {NULL};
    int rc = execve ("/bin/ls", argv, envp);
    return rc;
}

When I run that, I do indeed get a list of the files in the current directory.

like image 146
paxdiablo Avatar answered Sep 06 '26 02:09

paxdiablo


From the man pages,

int execve(const char *filename, char *const argv[], char *const envp[]);

So the problem in your case is that you haven't passed the 2nd and the 3rd argument correctly.

/* execve.c */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int
main(int argc, char *argv[])
{
    char *newargv[] = { NULL, "hello", "world", NULL };
    char *newenviron[] = { NULL };


newargv[0] = argv[1];

execve(argv[1], newargv, newenviron);


}
//This is a over-simplified version of the example in the man page

Run this as:

$ cc execve.c -o execve
$ ./execve ls
like image 33
Lelouch Lamperouge Avatar answered Sep 06 '26 02:09

Lelouch Lamperouge



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!