为什么此命令会使cmd崩溃?

HackingAddict1337

我遇到了一个令人难以置信的怪异脚本,它使控制台崩溃

set "h=/?" & call [if | for | rem] %%h%%
  • IFFOR而且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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么此代码会使Visual Studio 2015崩溃?

为什么此绕行功能会使程序崩溃?

为什么此代码不会使cin崩溃?为int变量C输入的char

为什么 SIGSEGV 不会使进程崩溃?

为什么放{''}会使React的渲染崩溃?

为什么在同一个条件变量上使用多个互斥锁会使此代码崩溃?

为什么运行此env-cmd命令会出现此错误?

为什么此程序在C中崩溃?

为什么访问已删除的指针不会使程序崩溃?

为什么扫描大的Blob值会使HBase群集崩溃?

为什么这会使机器人崩溃?

为什么调用外部函数指针会使程序崩溃?

c-为什么指向结构的指针会使程序崩溃?

为什么使用参数会使此功能变慢呢?

为什么此索引会使SELECT GROUP BY查询变慢?

为什么使用-Os进行编译会使此函数更大?

为什么添加此字段会使我的查询运行缓慢?

为什么提高精度会使此程序更快?

CMD / ComObject:为什么此CMD窗口的内容为零?

终端或“ ZSH”为什么抗议此命令

为什么此命令不返回别名?

为什么不能执行此命令?

为什么此MySQL Delete命令出错?

为什么CMD无法识别javadoc命令?

为什么使用“转换”压缩此 PDF 会使此 pdf 更大?

什么是_convertNSDictionaryToDictionary <A,B,其中...>(NSDictionary?)-> [A:B],为什么它会使我的应用程序崩溃?

为什么此代码有效且不会崩溃

为什么此C#代码使进程崩溃?

为什么此C到Pascal转换会崩溃?