【问题标题】:How do I provide stdin inputs from command line?如何从命令行提供标准输入?
【发布时间】:2011-07-27 15:48:20
【问题描述】:

我正在尝试对课程分配的程序执行缓冲区溢出攻击。攻击程序和易受攻击的程序都是我写的。

易受攻击的代码使用scanf从标准输入读取数据。

./vulnerable < malicious_payload_file.txt 工作正常。 more malicious_payload | ./vulnerableecho JUNK_JUNK_JUNK_JUNK | ./vulnerable 也可以正常工作。

但是,我想使用攻击程序继续提供越来越长的有效载荷,直到程序崩溃。所以,我需要动态生成更大的垃圾有效载荷。我正在使用system ("./vulnerable");反复调用并测试异常退出。

如何指定这样的负载?

有没有办法运行./vulnerable < malicious_payload_binary 或以某种方式运行,这样我就不必将恶意负载放入文件中,而是可以在命令行中指定它?

【问题讨论】:

  • 我不太明白你的问题。最后一行问题的答案可能是:echo "your payload goes here" | ./vulnerable但你已经知道了。那么,问题到底是什么?
  • @Susam Pal - 我一直在寻找一种比每次都为 echo 生成进程更有效的方法。每次我运行system 都会有一个bash 进程、echo 进程和易受攻击的进程。
  • 正如我在下面的一个 cmets 中提到的,echo 通常是一个内置的 shell。如果是这样,它不会产生新的进程。运行命令type echo 来查看它是否是shell-builtin。
  • @Susam Pal - 好的。我不知道这个。谢谢:-)
  • 您似乎对在命令行中指定在标准输入中提供之间的区别感到困惑。此外,您还担心效率实际上并不重要。

标签: c security penetration-testing stack-smash


【解决方案1】:

这个怎么样?

echo "your payload goes here" | ./vulnerable

您可以将echo 命令替换为生成所需的./vulnerable 输入的任何命令。一个这样的例子是将垃圾作为输入的恒定流,您可以这样做:

cat /dev/urandom | ./vulnerable

【讨论】:

  • 如果我通过管道生成 2 个进程,我是否不需要担心执行速度?
  • 我不知道!我没有这样做。
  • 感谢您尝试回答。我试过which echo 并得到了一个`/usr/bin/echo'。让我怀疑 echo 是否内置在 shell 中。我知道它内置在 DOS 的 command.com shell 中。
  • 不要尝试which echo。试试type echo
【解决方案2】:

您可以尝试使用popen 而不是system,而不是尝试使用命令行:

FILE *fp = popen("./vulnerable", "w");
// write stuff to fp -- it goes to vulnerable's stdin
int exitcode = pclose(fp);

您从pclose 获得的退出代码与您从system 获得的退出代码相同,如果您使用另一个进程来创建数据并通过shell 将其传送到./vulnerable

【讨论】:

    【解决方案3】:

    尝试管道而不是重定向:

    ./malicious_payload_binary | ./vulnerable
    

    【讨论】:

    • 这会说bash: malicious_payload_binary: command not found
    • 也许./malicious_payload_binary | ./vulnerable
    • @Grzegorz Szpetkowski - malicious_payload_binary 然后必须是具有执行权限的二进制文件 - 这意味着一个额外的过程。我试图完全避免文件并仅通过命令行发送有效负载 - 这甚至可能吗?
    【解决方案4】:

    编辑:我想我终于明白了你的问题(也许),你想阅读命令行参数吗?类似的东西

    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        printf("the name of this program is %s\n", argv[0]);
        printf("%d command line arguments were provided\n", argc);
        printf("the input file is %s\n", argv[1]);
        // could do something like: fopen(argv[1]) here
        return 0;
    }
    

    如果你将它编译成一个名为stdintest 的二进制文件并像这样运行它:

    ./stdintest somefile.txt

    它会输出:

    the name of this program is ./stdintest
    2 command line arguments were provided
    the input file is somefile.txt
    

    旧:

    正如 dolphy 所说,只需写入malicious_payload_binary 中的标准输出,从vulnerable 中的标准输入读取,然后用管道连接它们:./malicious_payload_binary | ./vulnerable

    【讨论】:

    • 我猜我被否决了,因为这不是“在命令行中指定有效负载”,而是 核心的答案b>(措辞不佳)问题:“我需要动态生成更大的垃圾有效载荷”。
    • 我没有对任何人投反对票。我确实理解我无法很好地表达这个问题并且太罗嗦了。但本质在于标题 - “如何重定向标准输入以获取命令行中指定的数据。”
    • 你仍然得到我的 +1,现在更是如此。
    最近更新 更多