在本文开始之前,请留意这是一份十分冗杂的信息安详告示。有关于Windows节制呼吁符,我大概发明白一个可以通过简朴批处理惩罚文件举办进攻的BUG。这个BUG存在于Windows 2000版本以上的64位以及32位呆板上,它是一个批处理惩罚理会错误。它不需要特别安装任何软件(cmd.exe是Windows默认安装的),它可以由任意权限的用户提倡(假设他们可以运行cmd.exe,从而理会批处理惩罚文件)包罗理会错误产生的位置(妨碍代码可以或许表明这个原因)。这并不是一个远端节制条理的BUG,仅仅是一个DoS范例,需要获得用户请求才气运行(可能是把其作为一个开机启动项)。可是由于他的简朴性,以及Windows系统的普及率,我小我私家认为它值得你看上那么一眼。
请留意,假如你启用这些批处理惩罚文件导致系统瓦解我是不认真任的!任务打点器会竣事这个失控剧本的PID,以防备你运行。
Tldr:一个仅仅包容^ nul<^ 的批处理惩罚文件会造成一个庞大的内存泄漏,在一个仅仅只有 ^|^ 的批处理惩罚文件会使呼吁行无限递归导致瓦解。这些行为大概导致一些有趣的批处理惩罚编程,虽然我是指的在windows2K版本以上的操纵系统中,原因在于cmd.exe在处理惩罚批处理惩罚文件时产生的逻辑错误。
当我再回覆一位用户提出的问题时,我碰着一个十分有趣的批处理惩罚文件理会异常,假如^这个字符是文件的最后一个字符,就大概产生内存泄漏,插入文件的最后一个字符不可以或许是 n (换行符),由于 r (回车符)在脱字标记之前就已经执行,所以没有这种环境产生,理会器可以或许正常事情,没有什么可以追踪到(当插入^rt,理会却成为了^r “t”就被忽略掉了)。最后留意一下,回车字符是可以或许正常执行的,虽然这也是一个小趣点,我们可以在大大都文本编辑器中对回车字符造假,在记事本的最后你可以傻逼的认为哪里尚有一个回车符
颠末一系列的折腾,我发明^字符在文件的最后大概导致内存泄漏,可能会致使呼吁提示符瓦解(详细点说就是 command.com 可能cmd.exe措施),我还发明非凡的批处理惩罚文件(及其序列)会引起一些有趣的现象。进一步的观测,引导我去存眷 是否其他人也有碰着过雷同的环境, a Stack Overflow question where a user noted a memory leak(在Stack Overflow提问中一个用户暗示内存泄漏)在SS64.com的主题 other interesting behaviors with the caret at the EOF(在文件最后加上回车符引起的有趣现象)。Stack Oveflow上面的提问辅佐我确认了这并不是一个无限轮回范例的环境,可是并没有表明清楚到底是怎么一回事,在SS64.com的主题中大部门内容都是在接头从各个方面让呼吁提示符瓦解,可是并没有对道理举办表明。
自然的在我心中发生了疑问,到底是怎么产生的?怎么产生的呢?这个环境是否可以举办操作呢?谜底是巨大的,可是办理要领确是很简朴(至少看起来简朴),我发明一些欺骗批处理惩罚文件组合,可以或许发生内存泄漏。是快是慢取决与你放入的批处理惩罚文件是什么(不是插入了几多字符,而是管道序列,以及行数长度)无论是呼吁提示符瓦解照旧内存泄漏,理会代码一直都是在单线程中驻留,所以CPU的占用量一直在增涨(单核CPU平均占用率到达98%)
让呼吁提示符瓦解很简朴,一个没有换行的批处理惩罚文件只需要包容 ^&^ (可能 ^|^)就足以导致呼吁提示符呈现0xC00000FD错误 ,这是一个由于无限递归栈/帧呈现的泄漏。这重现了“无限轮回”的场景,但没有完美表明内存泄漏(可能说是为什么这个无限轮回会导致瓦解),工作到这个水平,我开始通过举办一些最简朴的要领来发生一个内存泄漏,事实证明,一个2字节的批处理惩罚文件是需要耗损整颗CPU以及吃内存的(尽量速度慢的离谱,~8k/5s on a 2.2GHz i7)
我用来测试的批处理惩罚文件包括以下16进制字节
0x01 0x5E
0X5E 是脱字标记(^) ,0X01是标题开始的Ascll码。第一个16进制代码,在这个BUG中危险水平没有其它的高,因为他不能是NULL(0X00),r, |, 可能 & 这些字符会导致批处理惩罚文件通过正常途径退出(也就是 ‘invalid command detected’)。我利用0X01证实它没有一个有效的呼吁(可能显示出有关的字符)导致这个BUG,一个2字节的批处理惩罚文件包括一个简朴的^就足够了。
做一些其他测试,我发此刻批处理惩罚文件最后加上^ nul<^是最快也是最简朴的耗损CPU的要领。
随机的运行若干次后,请提高留意,这么做去耗损64位系统CPU是很快的。仅仅是花了20S,就吃掉了我14G的RAM(总共16GB,四核I7而且利用超线程技能),最后我不得不重启电脑。在32位系统上运行这个快速版本,尽量32位系统有2GB的限制,呼吁理会器也会很快的因为内存不敷而竣事任务。它不会导致呼吁提示符瓦解,相反的,它好像有一个检测机制掩护内存分派,当它不可以或许直接终止批处理惩罚历程时。