总结:运行了一个只有一行的批处理文件: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(本质上),以便再次解析该批处理(无限循环)。