Как работает вилочная бомба?

  • ПРЕДУПРЕЖДЕНИЕ НЕ ПОПЫТАЙТЕСЬ ПОЛУЧИТЬ ЭТО НА ПРОИЗВОДСТВЕННОЙ МАШИНОЙ

Прочитав страницу в Википедии по этой теме, я обычно следую тому, что происходит со следующим кодом:

:(){ :|:& };: 

выдержка из описания

В 2002 году в качестве искусства была представлена ​​следующая броская бомба; 5 6 его точное происхождение неизвестно, но оно существовало на Usenet до 2002 года. Бомба выполняется путем вставки следующих 13 символов в оболочку UNIX, такую ​​как bash или zsh . Он работает, определяя функцию, называемую «:», которая вызывает себя дважды, один раз на переднем плане и один раз в фоновом режиме.

Однако последний бит мне не совсем понятен. Я вижу определение функции:

 :(){ ... } 

Но что еще происходит? Кроме того, другие оболочки, такие как ksh , csh и tcsh также страдают от такой же судьбы, когда они могут построить нечто подобное?

One Solution collect form web for “Как работает вилочная бомба?”

Эта вибрирующая бомба всегда напоминает мне о том, что учитель по программированию ИИ сказал на одном из первых уроков, которые я посещал: «Чтобы понять рекурсию, сначала вы должны понимать рекурсию».

В его основе эта бомба является рекурсивной функцией. По сути, вы создаете функцию, которая вызывает себя, которая вызывает себя, которая сама вызывает … до тех пор, пока не будут потреблены системные ресурсы. В этом конкретном случае рекурсия усиливается за счет использования трубопровода функции для себя и ее построения.

Я видел, как это ответ на StackOverflow , и я думаю, что приведенный здесь пример иллюстрирует это лучше всего, просто потому, что легче увидеть, что он делает с первого взгляда (украденный из ссылки выше …)

 ☃(){ ☃|☃& };☃ 

Определите функцию ошибки ☃() { ... } , тело которой вызывает себя (функция ошибки), ☃|☃ вывод к себе (функция ошибки) ☃|☃ и ☃|☃ результат & . Затем, после того, как функция определена, на самом деле вызовите функцию ошибки ; ☃ ; ☃ .

Я отмечаю, что, по крайней мере, на моей Arch VM, необходимость фонового процесса не является обязательством иметь один и тот же конечный результат, чтобы потреблять все доступное пространство процесса и отображать хост b0rked. Фактически, теперь я сказал, что иногда прекращается процесс прогона и после экранирования -bash: fork: Resource temporarily unavailable он остановится с Terminated (а в journalctl показывает сброс ядра bash).

Чтобы ответить на ваш вопрос о csh / tcsh, ни одна из этих оболочек не поддерживает функции, вы можете только псевдоним. Поэтому для этих оболочек вам придется написать сценарий оболочки, который называет себя рекурсивно.

Кажется, что zsh страдает той же судьбой (с тем же кодом), не дает дампа ядра и заставляет Arch выдавать Out of memory: Kill process 216 (zsh) score 0 or sacrifice child. , но он по-прежнему продолжает развиваться. Через некоторое время он заявляет об Killed process 162 (systemd-logind) ... (и по-прежнему продолжает иметь вид zsh).

Arch, похоже, не имеет pacman версии ksh, поэтому мне пришлось попробовать его на debian. Объекты ksh : как имя функции, но используя что-то – скажем, b() вместо этого, похоже, имеют желаемый результат.

  • Zsh: завершение каталога хеширования
  • Невозможно удалить апострофы из имен файлов в терминале
  • Стандартный / канонический способ проверить, выводит ли предыдущий трубопровод выпуск?
  • Что используется сначала, .bashrc или .zshrc?
  • Как расширить подстроку команды?
  • Множественные замены в zsh?
  • Как выполнить несколько команд вместе в фоновом режиме?
  • zsh уведомление об электронной почте (в maildir)
  • Исполняемые файлы показывают с символом * рядом с их именем в выводе ls
  • Включить плагин для Oh my Zsh в Docker
  • zsh tcsh-like история навигации
  • Interesting Posts

    Что имеет приоритет – разрешение владельца / пользователя и группы?

    возвращает числовое значение индексированной переменной, а не ее имя

    почему emacs останавливает суперпользователя от редактирования файлов без разрешения?

    Как предварительно загружать мой .so каждый раз, когда приложение выполняется?

    Как выполнить скрипт позже?

    Авахи на FreeBSD: машина увидена, но не видит

    Принудительное воспроизведение звука с высоким качеством

    Как отсортировать строки по числу с плавающей запятой

    Нет DNS на Debian Wi-Fi после отсоединения кабеля DNS

    Pulseaudio жалуется на отсутствие «org.bluez» и не играет никакого звука. Как исправить?

    Какой механизм запрещает любому пользователю получать доступ к файлам других пользователей через root?

    Сделайте Ubuntu признаком того, что установлена ​​пользовательская встроенная версия PHP

    Увеличьте пространство виртуального жесткого диска на VMWare для Ubuntu

    Debian live install '' Как запустить установщик на терминале без прерывания живой сессии? ''

    Delta rpms и presto с yum

    Linux и Unix - лучшая ОС в мире.