2011-11-13 23 views
8

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

+4

你究竟想要达到什么目的?我的意思是,也许还有另一种更简单的方法来做到这一点。 – Aziz

+1

什么是您的操作系统,以及您如何执行此过程?它是用户激活的还是来自另一个进程? – ibid

+1

难道你不能只是'argc = 0'作为main()的第一行吗? –

回答

12

你可以编写一个程序,直接调用exec;它允许你指定命令行参数(包括程序名)并且缺少它。

+0

很好,它的工作原理。但任何想法如何传递参数,仍然argc = 0 – Keeto

+4

'argc'指示参数的数量(加上一个,程序名称),所以不,这是不可能的。 – ibid

+0

votex在工作哈哈我也卡住 –

3

你可以写与不argv的产卵/高管的其他程序,如C程序:

#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; 
} 
+0

这不会是未定义的行为? – user

+0

@user:不是。该标准将'argc'和'argv [0] == 0'视为非常好的情况。看[这个问题](http://stackoverflow.com/questions/2794150/when-can-argv0-have-null)。 –

2

你可以使用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(抓旗竞赛)问题?

+0

这不提供问题的答案。一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你将能够[评论任何职位](http://stackoverflow.com/help/privileges/comment);相反,[提供不需要提问者澄清的答案](http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [来自评论](/ review/low-quality-posts/15041212) –

+0

已修复,谢谢。 – vegafish