我遇到了一个令人难以置信的怪异脚本,它使控制台崩溃:
set "h=/?" & call [if | for | rem] %%h%%
IF
,FOR
而且REM
不是正常的内部命令。他们使用自己的特殊解析器,这可能会导致某些拦截错误,从而导致崩溃。@jeb指出CALL
不执行以下特殊字符,而是将它们转换为“令牌”(取决于版本):
&
退货 /
&&
退货 1
|
退货 2
||
退货 0
/?
退货 <
@
退货 +
@()
退货 ;
@if a==a :
退货 ,
@for %a in () do :
退货 +
@rem :
退货 -
但是,即使它们具有唯一的解析器,也仍然无法解释为什么它们都崩溃。所以我做了一些测试:
- 去掉
call
C:\>set "h=/?" & for %h% %%h%% was unexpected at this time.
- 将命令更改为其他内容。(我尝试了所有其他内部命令,但没有用)
- 分开两个命令:
C:\>set "h=/?" C:\>call for %%h%% --FOR help message--
- 加
@
C:\>set "h=/?" & call for @%%h%% CRASH!!!
- 包围脚本块
()
C:\>set "h=/?" & call for (%%h%%) CRASH!!!
问题摘要:
call
演什么角色?将CALL
启动第二轮解析器是必要的。
但是有一个小bug(或更多),在这个阶段它无法执行任何特殊命令或使用的&
,|
,&&
,||
,重定向或命令块。
原因似乎是解析器在内部构建了一个令牌图,将特殊的东西替换为某种令牌值。
但是CALL
执行者不再知道如何处理它们。
此代码尝试执行一个名为3.bat
!!!的批处理文件。
(名称可能会有所不同,具体取决于Windows版本)
set "cmd=(a) & (b)"
call %%cmd%%
但是在您的示例中,帮助功能是在不可执行的令牌上触发的。
这似乎是使执行者完全出于理智的最终死亡诱因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句