arquivo em lote come cpu e RAM usando apenas echo ^?

4

tldr: executou um arquivo de lote com apenas uma linha: echo ^ . Este arquivo come 70-100% de um núcleo e aprox. 1k de RAM por segundo ... ???

Ao responder esta pergunta, me deparei com um comportamento estranho nos arquivos em lote do Windows.

Eu estava tendo algum arquivo em lote divertido para mostrar ao OP que você poderia ter um ^ no final de uma linha em um arquivo de lote para continuação de linha, por exemplo:

arquivo test.bat :

echo How are ^
you today ^
my good fellow

A saída seria: How are you today my good fellow

Eu estava curioso para saber se o prompt de comando exibiria um More? do arquivo em lote semelhante ao prompt de comando se você tivesse uma linha como essa em um arquivo em lote: echo Do you want some ^

Se você fez isso na linha de comando, ele mostrará More? (como para mais entradas):

C:\>echo Do you want some ^
More?
No entanto, eu tentei esta linha (tendo apenas esta linha) em um arquivo em lotes e algum comportamento inexplicável aconteceu, então eu brinquei com o script para descobrir que a única vez que isso acontece é quando uma declaração echo é a última line e o ^ é o último caractere do arquivo de lote.

Um arquivo rápido para reproduzir:

arquivo test.bat :

echo ^

A execução desse arquivo em lote na minha máquina Windows 7 de 64 bits consumiu 70 a 100% de um dos meus núcleos e consumia cerca de 1k de memória a cada segundo.

A execução deste arquivo também ignorou todas as entradas (exceto que a tecla CTRL+ pressiona para finalizá-lo), embora após o arquivo ter sido finalizado, a entrada ainda tenha sido liberada para o console:

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 .....

Meu 'search-foo' (Stack Oveflow, Stack Exchange, MSDN, Google e Bing) não encontrou resultados que pudessem explicar esse comportamento estranho em um arquivo batch (somente o que o ^ faz em arquivos de linha de comando e batch ); Eu pensaria que, se a única linha em um arquivo de lote fosse echo ^ , seria apenas terminar o script e não ser executado até eu CTRL+C sair dele?

Alguém mais percebeu esse comportamento ou poderia explicar o que poderia causar isso? Além disso, isso poderia levar a qualquer possibilidade de ataque a um sistema?

Não é um grande problema (não tenho arquivos em lote que terminem em echo ^ ), mas me pareceu muito peculiar que 1 linha de resultados em lote em 1k / s ??

(Nota: vou tentar a mesma situação através de algumas linguagens de programação [.NET, Java e C / C ++] e alguns scripts web (JS talvez?) para ver o que acontece como resultado)

    
por txtechhelp 20.04.2014 / 20:12

1 resposta

3

Acontece que, na verdade, isso é um bug em como a linha de comando (mais especificamente cmd.exe ) analisa arquivos em lote e pode levar a uma rápida negação do ataque de tipo de serviço; Colocar a seguinte linha em um arquivo de lote (sem novas linhas) irá consumir grandes quantidades de memória muito rapidamente devido a esse bug (como um exemplo):

^ nul<^

Para encurtar a história, quando um cursor está no final do arquivo, o final real do arquivo é 'ignorado' e o identificador de arquivo 'redefinir' para 0 (essencialmente) para que o lote seja analisado novamente (ad infinitum) .

    
por 25.04.2014 / 06:30