11

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

4

3 回答 3

15

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

于 2011-11-13T19:00:14.083 回答
8

您可以使用 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 环境。

这个概念是:

  • 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

我想知道如果你正在做 Taesoo Kim 教授 (GATech) 提供的课程的实验室作业。课程链接:https ://tc.gtisc.gatech.edu/cs6265

还是黑客 CTF(抢旗比赛)问题?

于 2017-01-30T03:39:37.220 回答
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;
}
于 2011-11-13T19:01:24.447 回答