gpt4 book ai didi

c - execve不会运行可执行的汇编文件

转载 作者:行者123 更新时间:2023-11-30 15:46:02 25 4
gpt4 key购买 nike

我正在尝试创建一个 C 程序,该程序接受可执行文件及其参数并使用 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;
}

最佳答案

从您发布的源代码来看,您似乎总是在作为参数传递的名称前加上 /bin/ 前缀。因此,如果文件不在 /bin/ 中,则无法找到该文件,也无法运行该文件。

只需更改这两行:

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

成为:

strcpy(filename,argv[1]);

注意应用此修改后,需要指定要运行的程序及其完整路径。

因此,要运行 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");

要检测可能的 fork 失败,请进行更改:

pid = fork();

成为:

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

关于c - execve不会运行可执行的汇编文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18677877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com