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