我有一项任务要求我“打破”一段易受攻击的代码。片段:
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);
}
最后,我发现它非常简单,我担心自己的成绩可能不高......我的解决方案:
$ ./VulnerableCode 8 `freecell.exe`
噗 !!我正在玩freecell。为什么这样做?
答案 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。