2

我正在尝试在 Linux 上使用execve()from生成一个新进程。unistd.h我尝试将以下参数传递给它,execve("/bin/ls", "/bin/ls", NULL);但没有得到任何结果。我也没有收到错误,程序就退出了。发生这种情况有原因吗?我尝试以 root 和普通用户身份启动它。我需要使用的原因execve()是因为我试图让它在这样的程序集调用中工作

program: db "/bin/ls",0

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

谢谢!

4

3 回答 3

10

您传递给的论点execve是错误的。第二个和第三个都必须是具有 NULL 标记值的 char 指针数组,而不是单个指针。

换句话说,类似:

#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;
}

当我运行它时,我确实得到了当前目录中的文件列表。

于 2011-12-12T04:16:25.450 回答
2

手册页,

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

所以你的问题是你没有正确传递第二个和第三个参数。

/* 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

运行如下:

$ cc execve.c -o execve
$ ./execve ls
于 2011-12-12T04:17:49.190 回答
1

再次尝试阅读man execve。您正在向它传递错误的论点。特别注意第二个参数应该是什么。

此外,在下运行您的程序strace可能很有启发性。

于 2011-12-12T04:11:32.750 回答