printf在cygwin中执行.exe文件

时间:2009-09-28 12:48:56

标签: c cygwin printf exploit

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

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);
}

最后,我发现它非常简单,我担心自己的成绩可能不高......我的解决方案:

  • copypasta可执行文件进入主目录...我使用了freecell.exe
  • $ ./VulnerableCode 8 `freecell.exe`

!!我正在玩freecell。为什么这样做?

3 个答案:

答案 0 :(得分:3)

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

但是,你应该看看我在下面的段落中发布的链接,因为它可能会让你知道你可以在案例8中运行的漏洞。

旧答案: 我将不得不向更熟悉Windows体系结构的人留下更深入的答案,因为我看不到你的命令行如何可能导致freecell.exe被启动(顺便说一下,“freecell.exe”也被打印到控制台?)。但是,在高级别情况下,案例8易受Format string attacks攻击,这可以利用print假定第一个参数是格式字符串这一事实,该格式字符串指示{是否具有参数,类型参数}。这可以用于各种漏洞,具体取决于您传递的缓冲区。同样,我不知道如何在您的案例中启动流程。

答案 1 :(得分:0)

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

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

./ VulnerableCode 8 [backtick] freecell.exe [backtick]

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

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

您的代码永远不会看到文本“freecell.exe”只是其输出。所以,它不是你给出的代码中的漏洞,只是一种在bash中串联命令的方式。

答案 2 :(得分:0)

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

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