Tuesday, June 14, 2011

Fork bomb in 13 characters

วันก่อนเล่นเน็ตไปมาแล้วก็ไปเจอบทความในวิกิเกี่ยวกับเรื่อง fork bomb เข้า ผมก็เลยนั่งอ่านๆดูครับ ผมเชื่อว่าพวก geek หลายคนถึงจะไม่รู้จัก fork bomb มาก่อนแต่ถ้าได้เห็นชื่อก็น่าจะพอเดาได้ว่า fork bomb คืออะไร

fork bomb ก็เป็นการทำ denial-of-service แบบนึง ที่จะพยายาม fork process บนเครื่องออกมาให้มากๆ ในเวลาสั้นๆ ถึงแม้ว่า process เหล่านั้นจะไม่ได้ทำอะไรก็ตาม แต่สุดท้ายแล้วพอมี process โดน fork ออกมาเยอะๆ process table ของ OS ก็จะเต็ม ทำให้ไม่สามารถรันโปรแกรมใดๆได้อีก แนวคิดของ fork bomb ก็ประมาณเท่านี้ครับ ไม่มีอะไรมาก โจมตีด้วยจำนวนเข้าว่าเหมือน DOS ปกติ แต่สิ่งที่ทำให้ผมติดใจจนต้องมาเขียนเป็นบล็อกก็คือ โค้ดโปรแกรมที่ใช้เขียน fork bomb ครับ

ตัวอย่างโค้ดแรกที่ในวิกิเขียนไว้มองผ่านๆผมนึกว่าเป็นภาษาระดับต่ำซักภาษานึงซะอีก แต่ว่าคำอธิบายที่อยู่เหนือตัวอย่างนั้นมันดันเขียนว่า "shell fork bomb" ตอนแรกก็คิดว่า shell ของมันหมายถึง shell อย่างอื่นรึปล่าว ไม่น่าจะหมายถึง shell script ของ UNIX เพราะถ้ามันเป็น shell script ของ UNIX ผมน่าจะอ่านออก แต่นี่มองแล้วไม่รู้สึกว่ามันเป็น shell script แม้แต่นิดเดียว

:(){ :|:& };:

หลังจากการก็อปปี้โค้ดนี้ไปลองรันดูก็พบว่ามันเป็นโค้ดทำ fork bomb ด้วย shell script จริงๆครับ (แต่เครื่องผมลองไม่ตายนะ คาดว่าคงมีระบบป้องกันการทำ fork bomb อยู่) โชคดีครับที่ในวิกิมีเขียนอธิบายการทำงานของโค้ดนี้ไว้ด้วย ไม่งั้นให้ตายผมก็คงงงอยู่ว่ามันทำได้ไง

โค้ดนี้เขียนโดยรวบเอาโค้ดทั้งหมดที่ปกติเราจะเขียนด้วยหลายๆบรรทัดมาอยู่บรรทัดเดียวกันครับ ถ้าแยกบรรทัดกันก็จะเห็นเป็นแบบนี้

:()
{
: | : &
}
;
:

โดยที่ : ตัวแรกในโค้ดถูกใช้เป็นชื่อฟังก์ชันครับ (ความรู้ใหม่ : สามารถใช้เป็นชื่อฟังก์ชันได้ด้วยแฮะ) ถ้าจะให้อ่านง่ายขึ้นก็ลองเปลี่ยน : เป็นชื่อ fork_bomb ดูครับ

fork_bomb()
{
fork_bomb | fork_bomb &
}
;
fork_bomb

จะเห็นว่าโค้ดนี้เป็นการเขียนฟังก์ชัน recursive แล้วมีการเรียกใช้ฟังก์ชันที่บรรทัดสุดท้ายของโค้ด จะเห็นว่าส่วนหลักๆของโค้ดนี้ก็คือบรรทัด

fork_bomb | fork_bomb &

จะเห็นว่าเราเรียกฟังก์ชัน fork_bomb (ตัวที่อยู่ด้านหน้า) ให้ทำงานแล้ว pipe ผลลัพธ์ไปให้ fork_bomb ตัวที่อยู่ด้านหลังทำงานต่อ การเรียกฟังก์ชันหนึ่งครั้ง มันจะโหลดตัวเองขึ้นมาอีกสองครั้ง ทวีคูณอย่างนี้ไปเรื่อยๆ ส่วน & ที่อยู่ข้างหลังเพื่อทำให้ประโยคนี้ทำใน background ครับ และถ้า fork_bomb ตัวหน้าตาย fork_bomb ที่โดนเรียกตัวต่อๆมาก็จะไม่โดน auto-kill

หลังจากที่พยายามเสิร์ชภูมิหลังของโค้ดนี้ก็พบว่าโค้ดนี้ได้รับการยกย่องว่าเป็น "The most elegant example of fork bomb code" ถูกเขียนโดย Jaromil

หลังจากที่อ่านจบแล้วก็ได้แต่ทอดถอนใจ เฮ่อ อยากเขียนโค้ดเท่ๆแบบนี้ได้บ้างจัง

1 comment:

EThaiZone said...

โค้ดมันเท่จริงๆ นั้นแหละ คิดได้ไงเนี่ย กำลังนึกถึงว่าเป็นการ inject code เข้า php แล้วสั่งโหลดตัวเองซ้ำแบบนี้ จะกลายเป็นยังไง php.exe จะกลายร่างเป็นโกโก้ครั้นท์หรือเปล่า 555+