使用argc = 0执行进程

Kee*_*eto 10 c integer-overflow argv argc

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

ibi*_*bid 13

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

  • `argc`表示参数的数量(加上一个,对于程序名称),所以不,这是不可能的. (4认同)

veg*_*ish 5

您可以使用linux系统调用execve()

int execve(const char *filename, char *const argv[], char *const envp[]);
Run Code Online (Sandbox Code Playgroud)

您可以传递可执行文件的文件和空指针作为argv []来执行二进制文件,而argc将为零。

这是我的测试代码:

#include <stdio.h>
#include <unistd.h>

int main( void ) {
    char *argv[]={ NULL };
    execv( "./target", argv );
    return ( 0 );
}
Run Code Online (Sandbox Code Playgroud)

strace的结果是:

execve("./target", [], [/* 20 vars */]) = 0
Run Code Online (Sandbox Code Playgroud)

您可以使用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
Run Code Online (Sandbox Code Playgroud)

我想知道您是否正在做Taesoo Kim教授(GATech)提供的课程的实验任务。课程链接:https : //tc.gtisc.gatech.edu/cs6265

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