使用argc = 0执行进程

时间:2011-11-13 18:46:37

标签: c integer-overflow argv argc

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

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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