我正在尝试创建一个带有可执行文件及其参数的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;
}
答案 0 :(得分:1)
从您发布的来源看起来好像您总是在作为/bin/
参数传递的名称前缀。因此,如果文件不在/bin/
中,则无法找到,也无法运行。
只需改变这两行:
strcpy(filename, "/bin/");
strcat(filename,argv[1]);
是:
strcpy(filename,argv[1]);
注意,应用此修改后,需要使用其完整路径指定要运行的程序。
因此,要运行ls
,您需要将/bin/ls
specfify 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
成为:
{{1}}