【问题标题】:execve() failing to launch program in Cexecve() 无法在 C 中启动程序
【发布时间】:2011-12-12 04:06:26
【问题描述】:

我正在尝试在 Linux 上使用来自 unistd.hexecve() 生成一个新进程。我尝试将以下参数传递给它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

谢谢!

【问题讨论】:

    标签: c linux assembly execute execve


    【解决方案1】:

    您传递给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;
    }
    

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

    【讨论】:

    • 知道了,man execve 说的是一个数组,我假设只是一个普通的字符串就可以了。吸取教训,谢谢!
    【解决方案2】:

    来自man 页面,

    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
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • strace 给了我-1 EFAULT (Bad address),我已经重新阅读了它的手册页,但我仍然感到困惑。我是否错误地传递了第二个参数? (过程参数)
      猜你喜欢
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      相关资源
      最近更新 更多