Como funciona uma bomba de garfo?


22
  • AVISO NÃO TENTE EXECUTAR ISTO EM UMA MÁQUINA DE PRODUÇÃO

Ao ler a página da Wikipedia sobre o tópico , geralmente sigo o que está acontecendo com o seguinte código:

:(){ :|:& };:

trecho de descrição

A seguinte bomba de garfo foi apresentada como arte em 2002;56 sua origem exata é desconhecida, mas existia na Usenet antes de 2002. A bomba é executada colando os 13 caracteres a seguir em um shell UNIX , como bash ou zsh . Ele opera definindo uma função chamada ':', que se chama duas vezes, uma vez em primeiro plano e outra em segundo plano.

No entanto, o último pedaço não está totalmente claro para mim. Eu vejo a definição da função:

:(){ ... }

Mas o que mais está acontecendo? Também fazer outras conchas tais como ksh, cshe tcshtambém sofrem o mesmo destino de ser capaz de construir algo semelhante?


2
Este aparece muitas vezes em troca de pilha, uma resposta boa é aqui: stackoverflow.com/questions/991142/...
Drav Sloan

@ DravSloan - Eu estava tentando criar parte desse conteúdo aqui, minha pergunta é um pouco carregada dessa maneira 8-).
Slm

Você pode adicionar o obrigatório "Pelo amor de Deus, não execute isso em uma máquina de produção, ou se você quiser continuar usando a máquina, execute-o !!" mensagem :)
Drav Sloan

1
@ MartinSchröder - você entende que essa pergunta foi o que levou a pergunta a ser feita? 8-). Eu pedi isso na sexta-feira à noite para conseguir algo e, em seguida, a outra pergunta veio em uma ou duas horas depois.
slm

1
@ MartinSchröder - provavelmente é melhor deixá-los separados, eles são um pouco diferentes. Isso está pedindo uma visão detalhada de como as bombas de garfos funcionam, e que outro estava solicitando detalhes sobre o mecanismo por trás de como o sistema está sendo bifurcado dentro de uma bomba de garfos. Eu sei que pode parecer confuso porque eles estão relacionados, mas são diferentes (IMO - obviamente). Eu até respondi ao outro Q e tentei mostrar o mecanismo sob o capô que está dirigindo o garfo, e não o sinalizei como um idiota.
slm

Respostas:


23

Essa bomba de bifurcação sempre me lembra o que um professor de programação de IA disse em uma das primeiras lições que participei "Para entender a recursão, primeiro você precisa entender a recursão".

Na sua essência, esta bomba é uma função recursiva . Em essência, você cria uma função que se autodenomina, que autodenomina, que autodenomina ... até que os recursos do sistema sejam consumidos. Nesse caso específico, a recursão é amplificada pelo uso de canalizar a função para si mesma E em segundo plano.

Eu já vi isso respondido no StackOverflow , e acho que o exemplo dado aqui ilustra melhor, apenas porque é mais fácil ver o que ele faz de relance (roubado do link acima ...)

☃(){ ☃|☃& };☃

Defina a função bug ☃() { ... }, cujo corpo se chama (função bug), canalizando a saída para si (a função bug) ☃|☃e ponha em segundo plano o resultado &. Depois que a função for definida, chame a função bug ; ☃,.

Observo que, pelo menos na minha VM do Arch, a necessidade de background do processo não é um requisito para ter o mesmo resultado final, consumir todo o espaço de processo disponível e tornar o host b0rked. Na verdade, agora eu disse que às vezes parece que encerra o processo de fuga e depois que uma tela -bash: fork: Resource temporarily unavailabledele para com um Terminated(e journalctlmostra o bash core dumping).

Para responder sua pergunta sobre csh / tcsh, nenhum desses shells suporta funções, você pode apenas usar o alias. Portanto, para esses shells, você teria que escrever um script de shell que se chama recursivamente.

O zsh parece sofrer o mesmo destino (com o mesmo código), não core dump e faz com que Arch dê Out of memory: Kill process 216 (zsh) score 0 or sacrifice child., mas ainda continua a bifurcar. Depois de um tempo, ele afirma Killed process 162 (systemd-logind) ...(e continua a ter um zsh bifurcado).

O Arch não parece ter uma pacmanversão do ksh, então tive que experimentá-lo no debian. objetos ksh :como um nome de função, mas usar algo - digamos, b()parece ter o resultado desejado.


Quais são esses personagens? Eu sei que são insetos, mas como você os criou?
slm

10
Embora em um tamanho de fonte pequeno pareça um bug, você verá que é de fato um boneco de neve. Esse seria o caractere unicode U + 2603 que pode ser exibido em html digitando & # x 2603 sem os espaços.
Sambler 31/08/13

2
Aparentemente, no Linux, um número razoável de aplicativos relacionados ao Gnome e o Firefox suportam Ctrl+Shift+u+<hex>onde hex é o código hexadecimal do caractere unicode que você deseja exibir. Uma lista de unicodes visíveis pode ser encontrada em: fileformat.info/info/unicode/utf8test.htm (a maioria dos ímpares está nas seções "diversas"). O Windows deve finalizar a compra em superuser.com/questions/47420/… , e eu pessoalmente uso a ferramenta mencionada no link unicodeinput.exeou recortar e colar no meu navegador. Você sempre pode usar seqüências de html, conforme sugerido pelo sambler.
Drav Sloan

1
Wiki também tem uma lista de caracteres Unicode: en.wikipedia.org/wiki/List_of_Unicode_characters
Drav Sloan

Eu gostei do bug do boneco de neve, o que você está usando aqui não é exibido no meu sistema, aparece como uma caixa com números hexadecimais.
terdon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.