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

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

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

:(){ :|:& };: 

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

В 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() вместо этого, похоже, имеют желаемый результат.

  • Проблема Tmux Terminfo с привязкой клавиш Zsh
  • Проблемы с Vim при использовании ZSH
  • Не устанавливать $? на ненулевое значение на Control + C
  • Отключить завершение имени файла подстроки в zsh
  • Расширение {a..d} до abcd в zsh
  • zsh: То, что выражение glob эквивалентно `find. -тип f`?
  • Разделить оболочку горизонтально, чтобы показать ls -al и pwd
  • Как я могу перечислить все переменные оболочки?
  • Сломанный поиск истории после обновления oh-my-zsh
  • Как использовать `which` в команде aliased?
  • zsh завершение: меню и однозначный префикс с одной вкладкой?
  • Linux и Unix - лучшая ОС в мире.