使用argc = 0执行进程

是否可以执行argc = 0的进程? 我需要执行一个程序,但它的argc等于0是非常重要的。有没有办法做到这一点? 我试图在命令行中放置2 ^ 32个参数,使其看起来好像argc = 0但是参数数量有一个最大限制。

你可以编写一个直接调用exec的程序; 允许您指定命令行参数(包括程序名称)和缺少它。

您可以编写一个C程序来生成/执行没有argv的其他程序,例如:

 #include  #include  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; } 

你可以使用linux系统调用execve()

 int execve(const char *filename, char *const argv[], char *const envp[]); 

您可以传递可执行文件的文件和空指针作为argv []来执行二进制文件, argc将为零。

这是我的测试代码:

 #include  #include  int main( void ) { char *argv[]={ NULL }; execv( "./target", argv ); return ( 0 ); } 

并且结果是:

 execve("./target", [], [/* 20 vars */]) = 0 

您可以使用envp []传递您定义的参数。

此外,您可以使用汇编语言来达到目标​​(argc == 0但您仍需要传递参数)。 我假设您使用的是32位x86环境。

这个概念是:

  • 0x0b ($ SYS_execve)存储到%eax中
  • argv []地址放入%ebx
  • envp []地址放入%ecx
  • 然后使用int 0x80进行系统调用

内存结构如下所示:

 +--------------------------------------------------+ | +----------------------------------|-----+ vv 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(赶上旗帜竞赛)的问题?