0

我有一项任务要求我“破解”一段易受攻击的代码。片段:

int main(int argc, char **argv)
{

/*...*/

  while(i < argc-1)
  {
    switch(argv[i][0]-48)
    {
      case 1:
      SmashHeap(argc,argv);
    break;
/*...*/
      case 8:
      PrintfVulnerability(argv[++i]);
    break;
    default:
      printf("%s is not recognized by this program",argv[i++]);
/*...*/
    }
  i++;
  }
  return (1);
}

void PrintfVulnerability(char *F)
{
  printf(F);
}

最后,我发现它是如此简单,我担心我可能会得到一个差的成绩......我的解决方案:

  • 将可执行文件复制到主目录中...我使用了freecell.exe
  • $ ./VulnerableCode 8 `freecell.exe`

!!我在玩freecell。为什么这行得通?

4

3 回答 3

3

编辑:啊,我看到你的编辑。不幸的是,这些反引号解释了很多,在 bash(cygwin 的默认 shell)中,反引号指示 shell 将字符串作为 shell 命令执行。所以你所有的命令就是告诉 shell 运行 freecell。只需将 freecell.exe 不带引号地传递,这实际上会将字符串传递给程序。

不过,您应该查看我在下一段中发布的链接,因为它可能会让您了解可以在案例 8 上运行的漏洞利用。

旧答案: 我必须向对 Windows 体系结构有更好了解的人留下更深入的答案,因为我看不出您的命令行如何可能导致 freecell.exe 启动(顺便说一句,“freecell .exe”也打印到控制台?)。但是,在高级情况下,案例 8 容易受到格式字符串攻击,这可以利用 print 假定第一个参数是格式字符串这一事实,这表明 {无论它是否有参数,参数的类型} . 这可以用于各种攻击,具体取决于您传递的缓冲区。同样,我不明白这将如何导致启动您的情况下的流程。

于 2009-09-28T13:18:20.467 回答
0

您使用的是 cygwin 还是任何其他 bash 变体?

我问是因为命令开头的 $ 看起来像 bash,并且命令:

./VulnerableCode 8 [反引号]freecell.exe [反引号]

看起来像带有反引号的 bash 语法。

如果是这样,很容易解释:bash 将反引号之间的命令作为单独的命令执行,并将生成的 stdout 文本放入要传递给 VulnerableCode 命令的命令中。

您的代码永远不会只看到文本“freecell.exe”的输出。因此,这不是您给出的代码中的漏洞,只是在 bash 中将命令串在一起的一种方式。

于 2009-09-28T13:40:45.177 回答
0

在 Unix/Linux 环境中,反引号用于在反引号内运行命令并将该命令的输出提供给前面的命令。所以,ls [backtick]echo .[backtick]将 ls 当前目录。

因此,您在 cygwin 中的命令运行 freecell.exe 并等待 freecell 完成以将 freecell 的输出提供给 VulnerableCode。

于 2009-09-28T13:41:46.580 回答