批处理文件仅使用 echo ^? 就会占用 CPU 和 RAM?

批处理文件仅使用 echo ^? 就会占用 CPU 和 RAM?

总结:运行了一个只有一行的批处理文件:echo ^。此文件每秒消耗一个核心的 70-100% 和大约 1k RAM......???

回答时问题,我在 Windows 批处理文件中发现了一些奇怪的行为。

我正在使用一些批处理文件来向 OP 展示,你可以^在批处理文件的行尾使用一个来表示行的延续,例如:

文件test.bat

echo How are ^
you today ^
my good fellow

将输出:How are you today my good fellow

我很好奇,如果More?批处理文件中只有一行这样的内容,命令提示符是否会显示类似于命令提示符的批处理文件:echo Do you want some ^

如果您在命令行上执行此操作,它将显示More?(至于更多输入):

C:\>echo Do you want some ^
More?

但是,我在批处理文件中尝试了此行(只有此行)并且发生了一些无法解释的行为,因此我玩弄了脚本以发现唯一发生这种情况的时候是当语句echo是最后一行并且^是批处理文件的最后一个字符时。

快速重现的文件:

文件test.bat

echo ^

在我的 64 位 Windows 7 机器上运行该批处理文件占用了我的一个核心的 70-100% 并且每秒会占用大约 1k 内存!!

运行此文件也会忽略所有输入(除了CTRL+按下按键来结束它),尽管文件结束后输入仍然被刷新到控制台:

C:\>test.bat
(nothing is happening here except CPU/RAM eating)
(I would proceed to type something like "HELLO")
CTRL+C (script ends)
C:\>HELLO
'HELLO' is not recognized an internal .....

我的“搜索”(Stack Oveflow、Stack Exchange、MSDN、Google 和 Bing)没有找到任何可以解释批处理文件中这种奇怪行为的结果(仅限^于命令行和批处理文件中所做的事情);我想,如果批处理文件中只有一行,echo ^它是否会结束脚本并且直到我CTRL+C退出它才会运行?

有没有其他人注意到这种行为或可以解释是什么原因造成的?这是否会导致对系统的任何可能的攻击途径?

这不是一个大问题(我没有任何以 结尾的批处理文件echo ^),但一行批处理结果为 1k/s,这让我感到非常奇怪???

(旁注:我将通过一些编程语言 [.NET、Java 和 C/C++] 和一些 Web 脚本(可能是 JS?)尝试同样的情况,看看结果会怎样)

答案1

事实证明,这实际上是一个错误命令行(更具体地说cmd.exe)如何解析批处理文件并可能导致快速的拒绝服务类型攻击;由于这个错误,将以下行放入批处理文件中(没有新行)将很快消耗大量内存(作为示例):

^ nul<^

长话短说,当插入符号位于文件末尾时,文件的实际末尾将被“忽略”,并且文件句柄将“重置”为 0(本质上),以便再次解析该批处理(无限循环)。

相关内容