首页 文章

execve将不会运行可执行程序集文件

提问于
浏览
0

我正在尝试创建一个c程序,它接受一个可执行文件及其参数并使用execve运行它们,然后做一些其他无关紧要的事情 . 我遇到的问题是,在可执行的汇编文件上调用execve时,execve将无法正常工作 . 我认为问题出在我的路径上,因为我可以使unix shell命令工作,但我无法在当前目录中获取可执行文件(使用./spy ./executableName,其中spy是我的c程序的名称)来运行 . 这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/user.h>
#include <sys/reg.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

extern char **environ;

int main(int argc, char* const argv[]) {
    pid_t pid;
    char filename[50];
    char* arglist[argc];
    int i = 1,count = 0;
    int status;

    strcpy(filename, "/bin/");
    strcat(filename,argv[1]);
    for(i = 1; i< argc; i++)
        arglist[i-1] = argv[i];
    arglist[argc-1] = 0;
    arglist[0] = filename;
    if (argc == 1) {
        fprintf(stderr,"usage : %s <prog> ...\n",argv[0]);
        return -1;
    }
    pid = fork();
    if(pid == 0) {
        ptrace(PTRACE_TRACEME, 0, NULL, NULL);
        if(execve(filename, arglist, 0) < 0)
            fprintf(stdout,"Invalid file.");
    }
    else {
        while(1) {
            waitpid(pid,&status,0);
            if (WIFEXITED(status))
                break;
            ptrace(PTRACE_SINGLESTEP, pid,NULL, NULL);
            count++;
        }
    }
    return 0;
}

1 回答

  • 1

    从您发布的源代码看起来好像您始终使用 /bin/ 作为参数传递的名称前缀 . 因此,如果文件不在 /bin/ 中,则无法找到,也无法运行 .

    只需改变这两行:

    strcpy(filename, "/bin/");
    strcat(filename,argv[1]);
    

    成为:

    strcpy(filename,argv[1]);
    

    已应用此修改的 Note 需要使用其完整路径指定要运行的程序 .

    因此要运行 ls ,您需要将 /bin/ls 指定为程序的参数 .


    其他一些评论:

    因此,对于长路径/文件名更改,请避免缓冲区溢出:

    char filename[50];
    

    成为:

    char filename[PATH_MAX];
    

    要获得有关 execve() 可能更改失败的原因的更详细信息:

    if(execve(filename, arglist, 0) < 0)
      fprintf(stdout,"Invalid file.");
    

    成为:

    if(execve(filename, arglist, (char*) 0) < 0)
      perror("execve() failed");
    

    要检测可能的分叉失败,请执行以下操作:

    pid = fork();
    

    成为:

    if (-1 == (pid = fork())) then
    {
      perror("fork() failed");
    }
    else
    

相关问题