【问题标题】:executing a process with argc=0执行 argc=0 的进程
【发布时间】:2011-12-28 03:58:36
【问题描述】:

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

【问题讨论】:

  • 您到底想达到什么目的?我的意思是,也许还有另一种更简单的方法。
  • 你的操作系统是什么,你是如何执行这个过程的?它是用户激活的还是你从另一个进程调用的?
  • 你不能把argc = 0设置为main()的第一行吗?
  • 我无法控制源代码。但我知道在源代码中,如果 argc != 0 则退出。我在 linux ubuntu 上。我可以激活它,也可以从另一个进程调用它。

标签: c integer-overflow argv argc


【解决方案1】:

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

【讨论】:

  • 很好,它有效。但是任何想法如何传递参数并仍然保留 argc=0
  • argc 表示参数的数量(加一,作为程序名称),所以不,这是不可能的。
【解决方案2】:

您可以编写一个 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 :不是真的。该标准将argcargv[0] == 0 视为非常好的情况。见this question
【解决方案3】:

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

int execve(const char *filename, char *const argv[], char *const envp[]);

您可以传递可执行文件的 filename 和一个空指针作为 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(catch-the-flag竞赛)问题?

【讨论】:

    猜你喜欢
    • 2015-03-16
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2019-04-11
    • 2010-10-14
    • 2019-08-25
    相关资源
    最近更新 更多