ส้อมระเบิดทำงานอย่างไร


22
  • คำเตือนอย่าพยายามเรียกใช้สิ่งนี้บนเครื่องผลิต

ในการอ่านหน้า Wikipedia ในหัวข้อฉันมักจะติดตามสิ่งที่เกิดขึ้นด้วยรหัสต่อไปนี้:

:(){ :|:& };:

ตัดตอนมาจากคำอธิบาย

ระเบิดส้อมต่อไปนี้ถูกนำเสนอเป็นศิลปะในปี 2002;56 แหล่งกำเนิดที่แน่นอนของมันไม่เป็นที่รู้จัก แต่มันอยู่บน Usenet ปี 2002 ก่อนที่จะระเบิดจะถูกดำเนินการโดยการวางต่อไปนี้ 13 ตัวเป็น UNIXเปลือกเช่นทุบตีหรือzsh มันทำงานโดยการกำหนดฟังก์ชั่นที่เรียกว่า ':' ซึ่งเรียกตัวเองว่าสองครั้งหนึ่งครั้งในเบื้องหน้าและอีกครั้งในพื้นหลัง

อย่างไรก็ตามบิตสุดท้ายไม่ชัดเจนสำหรับฉัน ฉันเห็นนิยามของฟังก์ชัน:

:(){ ... }

แต่จะเกิดอะไรขึ้น นอกจากนี้ยังทำหอยอื่น ๆ เช่นksh, cshและtcshยังประสบชะตากรรมเดียวกันของความสามารถที่จะสร้างบางสิ่งบางอย่างที่คล้ายกัน?


2
หนึ่งนี้ปรากฏขึ้นค่อนข้างบ่อยในการแลกเปลี่ยนสแต็คคำตอบที่ดีอยู่ที่นี่: stackoverflow.com/questions/991142/…
Drav Sloan

@DravSloan - ฉันพยายามที่จะสร้างเนื้อหาบางส่วนที่นี่คำถามของฉันเป็นบิตโหลดในวิธีที่ 8-)
slm

คุณอาจต้องการเพิ่มข้อผูกมัด "สำหรับความรักของพระเจ้าไม่ได้เรียกใช้งานบนเครื่องผลิตหรือถ้าคุณต้องการใช้เครื่องที่คุณใช้งานต่อไป !!" ข้อความ :)
Drav Sloan

1
@ MartinSchröder - คุณเข้าใจว่าคำถามนี้เป็นสิ่งที่นำไปสู่คำถามที่ถาม? 8-) ฉันถามสิ่งนี้ในคืนวันศุกร์เพื่อให้บางสิ่งเกิดขึ้นและอีกคำถามก็มาในอีกหนึ่งชั่วโมงหรือสองชั่วโมงหลังจากนั้น
slm

1
@ MartinSchröder - อาจเป็นการดีที่จะแยกพวกเขาออกจากกันพวกเขาต่างกันเล็กน้อย นี่คือการขอมุมมองที่ละเอียดโดยละเอียดเกี่ยวกับวิธีการทำงานของ fork bombs ในขณะที่อีกคนหนึ่งกำลังถามถึงข้อมูลเฉพาะเกี่ยวกับกลไกที่อยู่เบื้องหลังว่าระบบจะใช้ระบบในการแยก fork fork อย่างไร ฉันรู้ว่ามันอาจจะสับสน b / c พวกเขาเกี่ยวข้อง แต่แตกต่างกัน (IMO - ชัด) ฉันตอบคำถามอื่น ๆ และพยายามแสดงกลไกภายใต้ประทุนซึ่งใช้ในการตีและฉันไม่ได้ตั้งค่าสถานะเป็นแบบดูอัล
slm

คำตอบ:


23

Fork fork นี้ทำให้ฉันนึกถึงสิ่งที่อาจารย์สอนโปรแกรม AI กล่าวไว้ในหนึ่งในบทเรียนแรกที่ฉันเข้าร่วม "เพื่อให้เข้าใจถึงการเรียกซ้ำครั้งแรกคุณต้องเข้าใจการเรียกซ้ำ"

ที่แกนกลางระเบิดนี้เป็นฟังก์ชั่นวนซ้ำ ในสาระสำคัญคุณสร้างฟังก์ชั่นซึ่งเรียกตัวเองซึ่งเรียกตัวเองซึ่งเรียกตัวเองว่า .... จนกระทั่งทรัพยากรระบบมีการบริโภค ในอินสแตนซ์ที่เฉพาะเจาะจงนี้การเรียกซ้ำจะถูกขยายโดยการใช้ฟังก์ชั่นไพพ์กับตัวมันเองและแบ็คกราวด์มัน

ฉันเคยเห็นคำตอบนี้มาจากStackOverflowและฉันคิดว่าตัวอย่างที่ให้ไว้จะแสดงให้เห็นว่าดีที่สุดเพียงเพราะมันง่ายต่อการดูว่ามันทำอะไรได้อย่างรวดเร็ว (ถูกขโมยจากลิงก์ด้านบน ... )

☃(){ ☃|☃& };☃

กำหนดฟังก์ชั่นข้อผิดพลาด☃() { ... }ร่างกายซึ่งเรียกตัวเอง (ฟังก์ชันข้อผิดพลาด) ท่อออกไปเอง (ฟังก์ชันข้อผิดพลาด) และพื้นหลังผล☃|☃ จากนั้นหลังจากที่ฟังก์ชั่นที่มีการกำหนดไว้จริงเรียกใช้ฟังก์ชันข้อผิดพลาดที่&; ☃

ฉันทราบว่าอย่างน้อยที่สุดใน Arch VM ของฉันความต้องการแบ็คกราวน์ของกระบวนการไม่ใช่ข้อกำหนดที่จะต้องมีผลลัพธ์ที่เหมือนกันเพื่อใช้พื้นที่กระบวนการทั้งหมดที่มีอยู่และแสดงโฮสต์ b0rked ที่จริงตอนนี้ฉันบอกว่าบางครั้งดูเหมือนจะยุติกระบวนการวิ่งหนีและหลังจากหน้าจอของ-bash: fork: Resource temporarily unavailableมันจะหยุดด้วยTerminated(และjournalctlแสดงการทุ่มตลาดหลักทุบตี)

ในการตอบคำถามของคุณเกี่ยวกับ 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 ดังนั้นฉันจึงต้องลองใช้เดเบียนแทน วัตถุ ksh :เป็นชื่อฟังก์ชั่น แต่ใช้สิ่ง - พูดb()แทนดูเหมือนว่าจะมีผลที่ต้องการ


ตัวละครเหล่านั้นคืออะไร? ฉันรู้ว่าพวกมันเป็นแมลง แต่คุณสร้างมันขึ้นมาได้อย่างไร?
slm

10
ในขณะที่ตัวอักษรขนาดเล็กมันดูเหมือนแมลงคุณจะพบว่าในความเป็นจริงมนุษย์หิมะ นั่นจะเป็นอักขระ Unicode U + 2603 ซึ่งสามารถแสดงเป็น html ได้โดยป้อน & # x 2603 โดยไม่มีช่องว่าง
sambler

2
เห็นได้ชัดว่าภายใต้ Linux มีแอพที่เกี่ยวข้องกับ Gnome จำนวนมากและ Firefox รองรับโดยCtrl+Shift+u+<hex>ที่ hex คือรหัสฐานสิบหกของอักขระยูนิโค้ดที่คุณต้องการแสดง รายการของยูนิโค้ดที่ดูได้สามารถดูได้ที่: fileformat.info/info/unicode/utf8test.htm (ส่วนใหญ่จะอยู่ในส่วน "เบ็ดเตล็ด") Windows ควรชำระเงินsuperuser.com/questions/47420/…และฉันใช้เครื่องมือที่กล่าวถึงในลิงก์unicodeinput.exeหรือตัดและวางผ่านเบราว์เซอร์ของฉัน คุณสามารถใช้ลำดับ html ตามที่แนะนำโดย sambler
Drav Sloan

1
วิกิยังมีรายการของอักขระ unicode: en.wikipedia.org/wiki/List_of_Unicode_characters
Drav Sloan

ฉันชอบข้อผิดพลาดของมนุษย์หิมะสิ่งที่คุณใช้ที่นี่ไม่ปรากฏในระบบของฉัน🐛ปรากฏขึ้นเหมือนกล่องที่มีเลขฐานสิบหกอยู่
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.