4

tldr: запустил пакетный файл, содержащий только одну строку: echo ^ . Этот файл съедает 70-100% одного ядра и ок. 1к оперативной памяти в секунду ...???

Отвечая на этот вопрос, я обнаружил странное поведение в пакетных файлах Windows.

У меня был какой-то забавный пакетный файл, чтобы показать ОП, что у вас может быть ^ в конце строки в пакетном файле для продолжения строки, пример:

файл 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% одного из моих ядер и потреблял примерно 1 КБ памяти каждую секунду !!

При запуске этого файла также игнорировались все входные данные (кроме нажатий 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 .....

Мой 'search-foo' (Stack Oveflow, Stack Exchange, MSDN, Google и Bing) не дал результатов, которые могли бы объяснить это странное поведение в командном файле (только то, что ^ делает в командной строке и командных файлах); Я бы подумал, что если бы единственная строка в пакетном файле была echo ^ то он просто завершил бы скрипт и не запустился бы, пока я не CTRL+C ?

Кто-нибудь еще заметил это поведение или мог бы объяснить, что может вызвать это? Также может ли это привести к возможным путям атаки на систему?

Это не главная проблема (у меня нет никаких пакетных файлов, которые заканчиваются на echo ^), но мне показалось очень странным, что 1 строка пакета приводит к 1k/s??

(Примечание: я собираюсь опробовать ту же самую ситуацию через некоторые языки программирования [.NET, Java и C/C++] и некоторые веб-скрипты (возможно, JS?) чтобы посмотреть что получится в результате)

1 ответ1

3

Как оказалось, это на самом деле ошибка в том, что командная строка (точнее, cmd.exe) анализирует командные файлы и может привести к быстрой атаке типа «отказ в обслуживании»; размещение следующей строки в пакетном файле (без новых строк) очень быстро израсходует огромные объемы памяти из-за этой ошибки (в качестве примера):

^ nul<^

Короче говоря, когда каретка находится в конце файла, фактический конец файла «игнорируется», а дескриптор файла «сбрасывается» в 0 (по существу), так что пакет анализируется снова (до бесконечности).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .