是否可以执行argc = 0的进程?我需要执行一个程序,但它的argc等于0是非常重要的。有没有办法做到这一点? 我试图在命令行中放置2 ^ 32个参数,使其看起来好像argc = 0但是参数个数有最大限制。
答案 0 :(得分:12)
您可以编写直接调用exec的程序;允许您指定命令行参数(包括程序名称)和缺少它。
答案 1 :(得分:3)
你可以编写一个C程序来生成/执行没有argv的其他程序,例如:
#include <spawn.h>
#include <stdlib.h>
int main(int argc, char** argv, char** envp)
{
pid_t pid;
char* zero_argv[] = {NULL};
posix_spawn(&pid, "./that_app", NULL, NULL, zero_argv, envp);
int status;
waitpid(&pid, &status, NULL);
return 0;
}
答案 2 :(得分:3)
您可以使用linux系统调用 execve() 。
int execve(const char *filename, char *const argv[], char *const envp[]);
你可以传递可执行文件的文件名和空指针作为 argv [] 来执行二进制文件, argc 将为零
这是我的测试代码:
#include <stdio.h>
#include <unistd.h>
int main( void ) {
char *argv[]={ NULL };
execv( "./target", argv );
return ( 0 );
}
strace 结果是:
execve("./target", [], [/* 20 vars */]) = 0
您可以使用 envp [] 来传递您定义的参数。
此外,您可以使用汇编语言来达到目标(argc == 0但您仍需要传递参数)。我假设您使用的是32位x86环境。
概念是:
内存结构如下所示:
+--------------------------------------------------+
| +----------------------------------|-----+
v v v------------------|-----|-----+
[arg_0][\0][...][arg_1][\0][...][arg_2][\0][...][ptr0][ptr1][ptr2][\0]
^
| (argv[] = NULL)
+--- envp
我想知道如果你正在做Taesoo Kim教授(GATech)提供的课程实验课。 课程链接:https://tc.gtisc.gatech.edu/cs6265
或者它是黑客CTF(赶超旗帜竞赛)的问题?