Come funziona una bomba a forcella?


22
  • ATTENZIONE NON TENTARE DI ESEGUIRE QUESTO SU UNA MACCHINA DI PRODUZIONE

Nel leggere la pagina di Wikipedia sull'argomento seguo generalmente quello che sta succedendo con il seguente codice:

:(){ :|:& };:

estratto di descrizione

La seguente bomba a forcella è stata presentata come arte nel 2002;56 la sua origine esatta è sconosciuta, ma esisteva su Usenet prima del 2002. La bomba viene eseguita incollando i seguenti 13 caratteri in una shell UNIX come bash o zsh . Funziona definendo una funzione chiamata ':', che si chiama due volte, una volta in primo piano e una volta in background.

Tuttavia l'ultimo bit non è del tutto chiaro per me. Vedo la definizione della funzione:

:(){ ... }

Ma cos'altro sta succedendo? Anche altre conchiglie come ksh, cshe tcshsubiscono lo stesso destino di poter costruire qualcosa di simile?


2
Questo apre molto spesso sullo scambio pila, una buona risposta è qui: stackoverflow.com/questions/991142/...
DRAV Sloan

@DravSloan - Stavo tentando di creare alcuni di questi contenuti qui, la mia domanda è un po 'carica in quel modo Cool.
slm

Potresti voler aggiungere l'obbligo "Per amore di Dio non eseguirlo su una macchina di produzione, o se vuoi continuare a usare la macchina su cui lo esegui !!" messaggio :)
Drav Sloan,

1
@ MartinSchröder: capisci che questa domanda è stata la causa della domanda? 8-). Ho chiesto questo venerdì sera per far andare qualcosa e poi l'altra domanda è arrivata dopo un'ora o due.
slm

1
@ MartinSchröder - probabilmente è meglio lasciarli separati, sono leggermente diversi. Ciò richiede una visione completamente dettagliata di come funzionano le bombe a forcella, mentre l'altra chiedeva dettagli sul meccanismo alla base di come il sistema sta biforcando all'interno di una bomba a forcella. So che potrebbe sembrare confuso b / c sono correlati ma sono diversi (IMO - ovviamente). Ho anche risposto all'altro Q e ho provato a mostrare il meccanismo sotto il cofano che sta guidando il bivio, e non l'ho contrassegnato come un dup.
slm

Risposte:


23

Questa bomba a forcella mi ricorda sempre ciò che un insegnante di programmazione AI ha detto in una delle prime lezioni che ho frequentato "Per capire la ricorsione, prima devi capire la ricorsione".

Al centro, questa bomba è una funzione ricorsiva . In sostanza, si crea una funzione, che si chiama, che si chiama, che si chiama .... fino a quando le risorse di sistema non vengono consumate. In questo caso specifico, la ricorsione è amplificata dall'uso del piping della funzione su se stesso E del backgrounding.

Ho visto la risposta su StackOverflow e penso che l'esempio fornito lì lo illustri meglio, solo perché è più facile vedere cosa fa a colpo d'occhio (rubato dal link sopra ...)

☃(){ ☃|☃& };☃

Definire la funzione bug ☃() { ... }, il cui corpo chiama se stesso (la funzione bug), reindirizzare l'output a se stesso (la funzione bug) ☃|☃e fare da sfondo al risultato &. Poi, dopo la funzione è definita, in realtà chiamare la funzione bug, ; ☃.

Noto che almeno sulla mia Arch VM, la necessità di eseguire il background del processo non è un requisito per avere lo stesso risultato finale, consumare tutto lo spazio di processo disponibile e rendere l'host b0rked. In realtà ora ho detto che a volte sembra terminare il processo di fuga e dopo una parte di -bash: fork: Resource temporarily unavailableesso si fermerà con un Terminated(e journalctlmostra il dumping core bash).

Per rispondere alla tua domanda su csh / tcsh, nessuna di queste shell supporta le funzioni, puoi solo alias. Quindi per quelle shell dovresti scrivere uno script shell che si chiama ricorsivamente.

zsh sembra subire lo stesso destino (con lo stesso codice), non esegue il core dump e causa Arch Out of memory: Kill process 216 (zsh) score 0 or sacrifice child., ma continua a biforcarsi. Dopo un po 'poi afferma Killed process 162 (systemd-logind) ...(e continua ancora ad avere un fork bsh).

Arch non sembra avere una pacmanversione di ksh, quindi ho dovuto provarlo su debian. ksh oggetti :come nome di una funzione, ma usando qualcosa - dire b()invece sembra avere il risultato desiderato.


Cosa sono quei personaggi? So che sono bug ma come li hai fatti?
slm

10
Mentre con una dimensione del carattere ridotta sembra un bug, scoprirai che in realtà è un pupazzo di neve. Sarebbe il carattere unicode U + 2603 che può essere visualizzato in html inserendo & # x 2603 senza gli spazi.
sambler

2
Apparentemente sotto Linux un discreto numero di app relative a Gnome e Firefox supportano Ctrl+Shift+u+<hex>dove hex è il codice esadecimale del carattere unicode che si desidera visualizzare. Un elenco di Unicode visualizzabili è disponibile all'indirizzo: fileformat.info/info/unicode/utf8test.htm (la maggior parte di quelli dispari si trova nelle sezioni "varie"). Windows dovrebbe controllare superuser.com/questions/47420/… e uso personalmente lo strumento menzionato nel link unicodeinput.exeo taglia e incolla tramite il mio browser. Puoi sempre usare sequenze HTML come suggerito da Sambler.
Drav Sloan,

1
Wiki ha anche un elenco di personaggi unicode: en.wikipedia.org/wiki/List_of_Unicode_characters
Drav Sloan

Mi è piaciuto il bug del pupazzo di neve, quello che stai usando qui non è visualizzato sul mio sistema, 🐛 appare come una scatola con numeri esadecimali.
terdon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.