linux中有多个系统调用命令

时间:2014-11-08 01:18:47

标签: linux command-line-arguments system-calls execve

我正在尝试执行具有以下

的程序(比如target.c)
void foo(char * arg)
{
    char cmd[16];
    char par[16]; 
    char * p;
    strcpy(cmd, "ls --color -l ");
    strcpy(par, arg);
    printf("You can use \"%s %s\" to list the files in dir \"%s\"!\n",cmd, par, par);
    p = (char*)malloc(strlen(cmd) + strlen(par) + 2);
    strcpy(p, cmd);
    strcat(p, " ");
    strcat(p, par);        
    system(p);
}
int main(int argc, char ** argv)
{         
  int i;
  char test[256];
  if (argc > 1)
      foo(argv[1]);
  else
      printf("usage: %s dir\n", argv[0]);
  return 0;
  foo(test);
};

现在我试图通过从另一个程序调用它来获取shell(重要的是从下面显示的另一个程序调用:

int main(int argc, char **argv)
{
    char * arrv[] = {NULL};
    char  *payload;
    int i; int j;
    char * argo[] = {"../targets/target1","sdknsd",NULL};
    strcpy(payload,"sd;/bin/sh");
    argo[1] = payload;
    i=fork();
    if(i == 0)
    {
        execve("../targets/target1" ,argo, arrv );
        exit(1);
    }
    else if(i == -1)
    {
        perror("fork()");
    }
}

我的问题是当我尝试执行目标并提供命令行参数时; / bin / sh然后我得到shell但不是从execve调用的情况。 任何帮助都会非常感激

好的是输出:

[hvalayap@localhost targets]$ ./target1 ds;/bin/sh 
ls: ds: No such file or directory
sh-2.05$

上面的程序将用户输入字符串附加到ls并将其传递给系统因此系统(ls ds; / bin / sh"给我shell

但是当我尝试用另一个程序(第二个程序)的execve做同样的事情时,它不起作用 说" ds"目录未找到

1 个答案:

答案 0 :(得分:0)

仔细查看您的代码。 char * payload 处于堆栈状态,然后您在此地址 strcpy ,因此您将覆盖堆栈上的本地变量。您没有为此指针分配内存(例如malloc或使用本地静态缓冲区)。如果用户输入字符串更长(例如255个符号),则会出现“分段错误”错误。

BTW:为什么你不能使用 snprintf 而不是 strcpy ?我认为更加安全。