Wie funktioniert eine Gabelbombe?


22
  • WARNUNG VERSUCHEN SIE NICHT, DIESES GERÄT AUF EINER PRODUKTIONSMASCHINE ZU LAUFEN

Wenn ich die Wikipedia-Seite zum Thema lese, verfolge ich im Allgemeinen die Vorgänge mit folgendem Code:

:(){ :|:& };:

Auszug aus der Beschreibung

Die folgende Gabelbombe wurde 2002 als Kunst präsentiert;56 Der genaue Ursprung ist nicht bekannt, aber es gab ihn im Usenet vor 2002. Die Bombe wird ausgeführt, indem die folgenden 13 Zeichen in eine UNIX- Shell wie bash oder zsh eingefügt werden . Es wird eine Funktion mit dem Namen ':' definiert, die sich zweimal im Vordergrund und einmal im Hintergrund aufruft.

Allerdings ist mir das letzte Stück nicht ganz klar. Ich sehe die Funktionsdefinition:

:(){ ... }

Aber was ist noch los? Auch tun andere Shells wie ksh, cshund tcshleiden auch das gleiche Schicksal der Lage zu sein , etwas Ähnliches zu konstruieren?


2
Dieser erscheint ziemlich oft beim Stapelaustausch
Drav Sloan

@DravSloan - Ich habe versucht, einen Teil dieses Inhalts hier zu erstellen. Meine Frage ist auf diese Weise etwas geladen. 8-).
slm

Vielleicht möchten Sie die obligatorische Option "Aus Liebe zu Gott nicht auf einer Produktionsmaschine ausführen, oder wenn Sie die Maschine weiterhin verwenden möchten, können Sie sie ausführen !!" hinzufügen. message :)
Drav Sloan

1
@ MartinSchröder - du verstehst, dass diese Frage dazu führte, dass diese Frage gestellt wurde? 8-). Ich habe dies an einem Freitagabend gefragt, um etwas in Gang zu bringen, und dann kam die andere Frage nach ein oder zwei Stunden.
slm

1
@ MartinSchröder - es ist wahrscheinlich am besten, sie als getrennt zu lassen, sie sind etwas unterschiedlich. Hier geht es um eine detaillierte Ansicht der Funktionsweise von Gabelbomben, und die andere fragt nach Einzelheiten zum Mechanismus, mit dem sich das System in einer Gabelbombe gabelt. Ich weiß, es mag verwirrend erscheinen, dass sie verwandt sind, aber sie sind unterschiedlich (IMO - offensichtlich). Ich antwortete sogar auf die andere Frage und versuchte, den Mechanismus unter der Motorhaube zu zeigen, der die Gabelung antreibt, und ich wies ihn nicht als Trottel aus.
slm

Antworten:


23

Diese Gabelbombe erinnert mich immer an etwas, was ein KI-Programmierlehrer in einer der ersten Lektionen sagte, an denen ich teilgenommen habe: "Um Rekursion zu verstehen, muss man zuerst Rekursion verstehen."

Diese Bombe ist im Kern eine rekursive Funktion. Im Wesentlichen erstellen Sie eine Funktion, die sich selbst aufruft, die sich selbst aufruft, die sich selbst aufruft ... bis Systemressourcen verbraucht sind. In diesem speziellen Fall wird die Rekursion verstärkt, indem die Funktion an sich selbst weitergeleitet UND im Hintergrund dargestellt wird.

Ich habe gesehen, dass dies auf StackOverflow beantwortet wurde , und ich denke, dass das dort angegebene Beispiel es am besten veranschaulicht, nur weil es einfacher ist, auf einen Blick zu sehen, was es tut (gestohlen vom obigen Link ...)

☃(){ ☃|☃& };☃

Definieren Sie die Fehlerfunktion ☃() { ... }, deren Hauptteil sich selbst aufruft (die Fehlerfunktion), die Ausgabe an sich selbst weiterleitet (die Fehlerfunktion) ☃|☃und das Ergebnis im Hintergrund &. Rufen Sie dann, nachdem die Funktion definiert wurde, tatsächlich die Fehlerfunktion auf ; ☃.

Ich stelle fest, dass zumindest auf meiner Arch-VM die Notwendigkeit, den Prozess im Hintergrund auszuführen, keine Voraussetzung dafür ist, dass dasselbe Endergebnis erzielt wird, der gesamte verfügbare Prozessspeicher belegt und der Host blockiert wird. Eigentlich habe ich jetzt gesagt, dass es manchmal den Run-Away-Prozess zu beenden scheint und nach einem Screenful -bash: fork: Resource temporarily unavailablemit einem Terminated(und journalctlzeigt bash core dumping) aufhört .

Um Ihre Frage zu csh / tcsh zu beantworten, unterstützt keine dieser Shells Funktionen. Sie können nur einen Aliasnamen verwenden. Für diese Shells müssten Sie also ein Shell-Skript schreiben, das sich selbst rekursiv aufruft.

zsh scheint dasselbe Schicksal zu erleiden (mit demselben Code), entleert den Kern nicht und veranlasst Arch, zu geben Out of memory: Kill process 216 (zsh) score 0 or sacrifice child., aber es gibt sich weiterhin. Nach einer Weile heißt es dann Killed process 162 (systemd-logind) ...(und hat immer noch eine Gabelung zsh).

Arch scheint keine pacmanVersion von ksh zu haben, also musste ich es stattdessen mit Debian versuchen. ksh Objekte :als Funktionsname, aber mit etwas - sagen b()stattdessen scheint das gewünschte Ergebnis zu haben.


Was sind das für Charaktere? Ich weiß, dass sie Wanzen sind, aber wie haben Sie sie gemacht?
SLM

10
Obwohl es bei einer kleinen Schriftgröße wie ein Käfer aussieht, werden Sie feststellen, dass es sich tatsächlich um einen Schneemann handelt. Dies wäre das Unicode-Zeichen U + 2603, das in HTML durch Eingabe von & # x 2603 ohne Leerzeichen angezeigt werden kann.
Sambler

2
Anscheinend unterstützen unter Linux eine ganze Reihe von Gnome-bezogenen Apps und Firefox Ctrl+Shift+u+<hex>den Hex-Code des Unicode-Zeichens, das Sie anzeigen möchten. Eine Liste der sichtbaren Unicodes finden Sie unter: fileformat.info/info/unicode/utf8test.htm (die meisten ungeraden finden Sie in den Abschnitten "Verschiedenes"). Windows sollte superuser.com/questions/47420/… auschecken und ich persönlich benutze das in dem Link erwähnte Tool unicodeinput.exeoder schneide es über meinen Browser aus und füge es ein. Sie können immer HTML-Sequenzen verwenden, wie von Sambler vorgeschlagen.
Drav Sloan

1
Wiki hat auch eine Liste von Unicode-Zeichen: en.wikipedia.org/wiki/List_of_Unicode_characters
Drav Sloan

Ich mochte den Schneemann-Bug, der hier verwendete wird auf meinem System nicht angezeigt, displayed erscheint wie ein Kästchen mit Hex-Zahlen.
Terdon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.