Board logo

标题: 大家看看 ">>> 会出现什么 [打印本页]

作者: neorobin    时间: 2012-4-13 15:23     标题: 大家看看 ">>> 会出现什么

闲来无事, 在命令行瞎敲了些东西
  1. ">
  2. ">>
  3. ">>>
  4. ">>>>
  5. ">>>>>
  6. ">>>>>>
  7. ">>>>>>>
  8. ">>>>>>>>
  9. ">>>>>>>>>
  10. ">>>>>>>>>>
复制代码
我的机器上, ">>  打开了 C:\Program Files\Borland\Delphi7\Bin 目录下的 oh.exe
">>> 打开了 D:\My Documents\neo 下的 123.bat
">>>>> 打开了 C:\Program Files\Borland\Delphi7\Bin 下的 brc32.exe

这些被打开的可执行文件所在的目录都包含在 %path% 里.

初步猜测, 这里 > 被用成了通配符, 就象 ? 一样, 通配一个字符, 在 %path% 所包含的那些目录路径中, 如果能搜索到一个文件名字符数量(不算 . 号及扩展名, 取字节还是字符不确定)上可以与 > 的数量相匹配的可执行文件(.exe, .bat, .cmd 等), 就会打开那个文件, 而匹配的优先级, 猜测是以字符串次序, 当然这些都只是猜测, 各位若有兴趣, 望请劳烦弄清因由.
作者: cjiabing    时间: 2012-4-13 15:50

  1. C:\Documents and Settings\甲兵>">
  2. '">' 不是内部或外部命令,也不是可运行的程序
  3. 或批处理文件。
  4. C:\Documents and Settings\甲兵>">>
  5. 列表是空的。
  6. C:\Documents and Settings\甲兵>">>>
  7. '">>>' 不是内部或外部命令,也不是可运行的程序
  8. 或批处理文件。
  9. C:\Documents and Settings\甲兵>">>>>
  10. '">>>>' 不是内部或外部命令,也不是可运行的程序
  11. 或批处理文件。
复制代码

作者: neorobin    时间: 2012-4-13 20:22

回复 1# neorobin

下面的形式都 可能 打开 记事本 或者 画图, 而 ">>>>>>> 却可能什么也打不开
这些形式只是部分列举而已, 并不限于 7 个字符的情形, 比如 "m>c 有可能打开 mmc, "fr>>>ell 可能打开 空当接龙, ">>>>arts 可能打开 红心 游戏, 等...
  1. ">otepad
  2. ">>tepad
  3. ">>>epad
  4. ">>>>pad
  5. ">>>>>ad
  6. ">>>>>>d
  7. ">spaint
  8. ">spain>
  9. ">spa>>>
  10. ">spa>>>
  11. ">spa>>t
  12. ">>>>>>t
  13. "m>>>>>t
  14. "m>p>>>t
  15. ">>pai>t
复制代码

作者: applba    时间: 2012-4-13 20:41

回复 3# neorobin

单引号实际上是双引号的略写。
<或>都可以用来代替一个字符。
  1. "mspai>>"
  2. "mspai<<"
  3. "mspai<>"   
复制代码

作者: fatcat    时间: 2012-4-13 20:54

本帖最后由 fatcat 于 2012-4-13 21:01 编辑

回复 4# applba

这些也可能打开 记事本
  1. "not>>><"
  2. "not>>><
  3. "not>><<
  4. "not><<<
  5. "not<<<<
  6. "no<<<<<
  7. "no<<<ad
  8. "no<<<a<
复制代码

作者: applba    时间: 2012-4-13 20:57

回复 5# fatcat

notepad或notepad.exe
作者: fatcat    时间: 2012-4-13 21:00

回复 6# applba

惭愧, 确实打错了字母, 更正了
作者: zjw767676    时间: 2012-4-13 21:17

  1. Microsoft Windows [版本 6.1.7601]
  2. 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
  3. D:\Users\zjw>">>
  4. 拒绝访问。
  5. D:\Users\zjw>">>>
  6. D:\Users\zjw>">>>>
  7. '">>>>' 不是内部或外部命令,也不是可运行的程序
  8. 或批处理文件。
  9. D:\Users\zjw>">>>>>
  10. D:\Users\zjw>">>>>>>
  11. '">>>>>>' 不是内部或外部命令,也不是可运行的程序
  12. 或批处理文件。
  13. D:\Users\zjw>">>>>>>>
  14. '">>>>>>>' 不是内部或外部命令,也不是可运行的程序
  15. 或批处理文件。
复制代码

作者: CrLf    时间: 2012-4-13 21:37

真是奇怪的现象,试了下似乎只有<>这俩字符有此效果,而其他几个保留字符中,: \ / ? 这四个符号可以解释为它们可能属于路径信息的一部分,而 * 和 | 两个字符却说不通为何会区别于 < 和 >
作者: fatcat    时间: 2012-4-13 23:01

简单测试后, 认为是按 字符 而非 字节 匹配的, 另外搜索路径不止于 %path% 包含的, 也包括当前工作目录, 另外可匹配的文件也包括不可执行的文件, 但扩展名部分不省略:

如: 中文file.txt 用下面的方式都可匹配:
  1. ">>>ile.>>t
  2. ">>>ile.>>>
复制代码

作者: gawk    时间: 2012-4-13 23:15

回复 10# fatcat


    而且,当前目录的优先级高于%path%,是这样吧。
作者: CrLf    时间: 2012-4-15 19:03

顶起等待 qzw 分析
作者: ivor    时间: 2012-4-15 19:51

  1. m^>c
  2. wu^>a
复制代码

作者: rat    时间: 2012-4-17 10:31

cmd调用了函数FindFirstFile,这个API导致了楼主发现的问题!
查MSDN,也没有发现FindFirstFile对“<”和“>”如何处理的具体描述。

参考链接:
http://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx
http://msdn.microsoft.com/en-us/ ... (v=vs.85).aspx?id=3
作者: qzwqzw    时间: 2012-4-21 23:32

回复 14# rat
如你所言
问题很可能出在FindFirstFile()上
在双字节字符集环境下它实际上就是FindFirstFileW()

在cmd层级只将? * 视作文件通配符
但FindFirstFile也将 < > 视作文件通配符
>会匹配相当于0个或1个任意字符,相当于?
<会匹配相当于0个或多个任意字符,相当于*

在做可执行程序调用时
cmd会检查 ? * 的存在并给出错误提示
但对< >会不做任何处理
因为一般情况下
< >会在解析文件名之前
就被当作重定向符号而被脱去
但如果< >被^或者"转义
则在文件查询请求交给FindFirstFile时
< > 仍然会作为文件名的一部分存在
导致FindFirstFile发生通配现象

值得注意的是
FindFirstFile()在很多种情况下被直接或间接调用
比如for命令的文件集
它们也存在类似的现象或者称之为问题

FindFirstFile的宿主程序Kernel32.dll历经多次升级
不太可能留下如此明显的bug
因此我猜测这个现象更像是一个undocumnetd后门




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2