执行一个参数计数为0的进程

11

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


4
你想实现什么目标?也许有另外一种更简单的方法来完成它。 - Aziz
1
你的操作系统是什么,你是如何执行这个进程的?它是用户激活的还是从另一个进程调用的? - ibid
2
你不能只是在main()的第一行设置argc = 0吗? - Carl Norum
3
此外,这个问题也相关:https://dev59.com/ZXE85IYBdhLWcg3wZyqt - Aziz
我无法控制源代码。但我知道在源代码中,如果argc != 0,则会退出。我在Linux Ubuntu上。我可以激活它,或者我可以从另一个进程中调用它。 - Keeto
显示剩余3条评论
3个回答

15

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


太好了,它可以工作。但是有没有想法如何传递参数并仍然保持argc=0? - Keeto
4
"argc" 表示参数的数量(加上程序名称,因此不,这是不可能的。 - ibid

11
您可以使用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);
    // execv is correct, look up https://linux.die.net/man/3/execv
    return 0;
}

而且 strace 的结果是:
execve("./target", [], [/* 20 vars */]) = 0

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

此外,你可以使用汇编语言来实现你的目标(argc == 0但仍需要传递参数)。我假设你正在使用32位x86环境。

概念如下:

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

内存结构如下所示:

+--------------------------------------------------+     
|               +----------------------------------|-----+
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(夺旗赛)问题吗?


4
您可以编写一个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;
}

这不会是未定义行为吗? - user
@user:不完全是这样。标准将argcargv[0] == 0视为完全正常的情况。请参见此问题 - Daniel Kamil Kozar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接