是否可以执行一个argc = 0的进程?我需要执行一个程序,但它的argc等于0非常重要。有没有办法做到这一点? 我尝试在命令行中放置2^32个参数,以便看起来好像argc = 0,但是参数数量有最大限制。
是否可以执行一个argc = 0的进程?我需要执行一个程序,但它的argc等于0非常重要。有没有办法做到这一点? 我尝试在命令行中放置2^32个参数,以便看起来好像argc = 0,但是参数数量有最大限制。
您可以编写一个直接调用exec函数的程序,这允许您指定命令行参数(包括程序名称)和缺少参数。
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);
// execv is correct, look up https://linux.die.net/man/3/execv
return 0;
}
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
我想知道你是否正在完成由金泰洙(GATech)教授提供的课程实验任务。 课程链接:https://tc.gtisc.gatech.edu/cs6265
或者这是一个黑客CTF(夺旗赛)问题吗?
#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;
}
main()
的第一行设置argc = 0
吗? - Carl Norum