Як працює вилка бомба?


22
  • ПОПЕРЕДЖЕННЯ НЕ намагайтеся запустити це на виробничій машині

Читаючи сторінку Вікіпедії по цій темі, я, як правило, слідую за тим, що відбувається із наступним кодом:

:(){ :|:& };:

уривок опису

Наступна вилка бомба була представлена ​​як мистецтво в 2002 році;56 його точне походження невідомо, але воно існувало на Usenet до 2002 року. Бомба виконується шляхом вставлення наступних 13 символів у оболонку UNIX, наприклад bash або zsh . Він функціонує, визначаючи функцію під назвою ":", яка викликає себе двічі, один раз на передньому плані та один раз на задньому плані.

Однак останній біт мені не зовсім зрозумілий. Я бачу визначення функції:

:(){ ... }

Але що ще відбувається? Чи також інші снаряди, такі як ksh, cshі tcshтакож страждають такою ж долею, що змогли побудувати щось подібне?


2
Це один спливає досить часто на обмін стека, хороший відповідь тут: stackoverflow.com/questions/991142 / ...
Drav Sloan

@DravSloan - я намагався створити тут щось із цього контенту, моє запитання трохи завантажене таким чином 8-).
slm

Ви можете додати обов'язкове "Для любові Божої не запускайте це на виробничій машині, або якщо ви хочете продовжувати користуватися машиною, ви запускаєте її !!" повідомлення :)
Drav Sloan

1
@ MartinSchröder - Ви розумієте, що саме це питання було причиною того, щоб його задати? 8-). Я запитав це в ніч на п’ятницю, щоб щось вийти, а потім інше запитання з’явилося через годину чи 2 згодом.
slm

1
@ MartinSchröder - напевно, найкраще залишити їх окремими, вони трохи відрізняються. Це вимагає загального детального перегляду того, як працюють вилкові бомби, а інший запитував конкретні відомості про механізм, як система розкочується в межах вилкової бомби. Я знаю, що це може здатися заплутаним, вони пов'язані, але вони різні (ІМО - очевидно). Я навіть відповів на інший Q і спробував показати механізм під капотом, який веде розгін, і я не позначив це як дуп.
slm

Відповіді:


23

Ця вилка бомба завжди нагадує мені те, що сказав вчитель програмування AI на одному з перших уроків, які я відвідував, "Щоб зрозуміти рекурсію, спочатку ти повинен зрозуміти рекурсію".

По суті, ця бомба є рекурсивною функцією. По суті, ви створюєте функцію, яка викликає себе, яка викликає себе, яка викликає себе ...., поки системні ресурси не будуть витрачені. У цьому конкретному випадку рекурсія посилюється за рахунок використання функції трубопроводу до себе І підключення до неї.

Я бачив цю відповідь на StackOverflow , і я думаю, що наведений там приклад ілюструє це найкраще, просто тому, що простіше зрозуміти, що це робиться з першого погляду (викрадено за посиланням вище ...)

☃(){ ☃|☃& };☃

Визначте функцію помилки ☃() { ... }, тіло якої викликає себе (функція помилки), передаючи висновок до себе (функція помилки) ☃|☃та фоновий результат &. Потім, після того , як функція визначена, на самому ділі виклик функції помилок, ; ☃.

Зауважу, що принаймні в моєму Arch VM необхідність фонового процесу не є вимогою мати однаковий кінцевий результат, споживати весь доступний простір процесу та робити хост b0rked. Насправді зараз я казав, що, здається, іноді припиняється процес утікання, і після того, як -bash: fork: Resource temporarily unavailableйого скрипт зупиниться Terminatedjournalctlпоказує демпінг ядра bash).

Щоб відповісти на ваше запитання щодо csh / tcsh, жодна з цих функцій підтримки оболонок, ви можете лише псевдоніми. Тож для цих оболонок вам доведеться написати сценарій оболонки, який називає себе рекурсивно.

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

Арка, схоже, не має pacmanверсії ksh, тому мені довелося спробувати її на debian. ksh об’єкти :в якості назви функції, але використовуючи щось - скажіть, b()замість цього, здається, бажаний результат.


Що це за персонажі? Я знаю, що вони клопи, але як ти їх зробив?
slm

10
Хоча при невеликому розмірі шрифту це схоже на помилку, ви виявите, що він насправді сніговик. Це буде символ Unicode U + 2603, який можна відобразити в html, ввівши & # x 2603 без пробілів.
самблер

2
Очевидно, в Linux досить велика кількість програм, пов’язаних із Gnome та Firefox, підтримують те, Ctrl+Shift+u+<hex>де hex - це шістнадцятковий код символу unicode, який ви бажаєте відобразити. Список видимого Unicode можна знайти за адресою: fileformat.info/info/unicode/utf8test.htm (більшість непарних - у розділах "інше"). Windows має перевірити superuser.com/questions/47420/… , і я особисто використовую інструмент, згаданий у посиланні, unicodeinput.exeабо вирізати та вставити через свій браузер. Ви завжди можете використовувати html-послідовності, як запропонував sambler.
Драв Слоун

1
У Wiki також є список символів унікоду: en.wikipedia.org/wiki/List_of_Unicode_characters
Drav Sloan

Мені сподобалася помилка сніговика, той, який ви тут використовуєте, не відображається в моїй системі, 🐛 видається як коробка з шестигранними номерами.
terdon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.