ซิปบอมบ์ มันทำงานอย่างไร ระเบิดเก็บถาวรของปูติน Wordpress ได้ตัดสินเราแล้ว

💖 ชอบไหม?แชร์ลิงก์กับเพื่อนของคุณ
[อัพเดท] ตอนนี้ฉันอยู่ในรายการข่าวกรองเพราะฉันเขียนบทความเกี่ยวกับ "ระเบิด" บางประเภทใช่ไหม

หากคุณเคยโฮสต์เว็บไซต์หรือดูแลเซิร์ฟเวอร์ คุณอาจตระหนักดีถึงคนเลวที่พยายามทำสิ่งเลวร้ายกับทรัพย์สินของคุณ

เมื่อฉันโฮสต์กล่อง Linux เล็กๆ ของฉันด้วยการเข้าถึง SSH เมื่ออายุ 13 ปี ฉันดูบันทึกและทุกวันฉันเห็นที่อยู่ IP (ส่วนใหญ่มาจากประเทศจีนและรัสเซีย) พยายามเชื่อมต่อกับกล่องเล็กๆ แสนหวานของฉัน (ซึ่งจริงๆ แล้วคือ แล็ปท็อป ThinkPad T21 เครื่องเก่าที่มีหน้าจอเสียส่งเสียงหึ่งๆ อยู่ใต้เตียง) ฉันรายงาน IP เหล่านี้ไปยัง ISP ของพวกเขาแล้ว

อันที่จริง หากคุณมีเซิร์ฟเวอร์ Linux ที่มี SSH แบบเปิด คุณสามารถดูได้ด้วยตนเองว่ามีการพยายามเชื่อมต่อกี่ครั้งในแต่ละวัน:

Grep "การตรวจสอบสิทธิ์ล้มเหลว" /var/log/auth.log


ความพยายามในการให้สิทธิ์ที่ล้มเหลวนับร้อยครั้ง แม้ว่าเซิร์ฟเวอร์จะไม่มีการให้สิทธิ์รหัสผ่านเลยและทำงานอยู่บนพอร์ตที่ไม่ได้มาตรฐาน

Wordpress ได้ตัดสินเราแล้ว

เอาล่ะ มาเผชิญหน้ากัน มีเครื่องสแกนช่องโหว่ของเว็บมาก่อน Wordpress แต่หลังจากที่แพลตฟอร์มได้รับความนิยมอย่างมาก สแกนเนอร์ส่วนใหญ่เริ่มตรวจหาโฟลเดอร์ wp-admin ที่กำหนดค่าไม่ถูกต้องและปลั๊กอินที่ไม่ได้แพตช์

ดังนั้น หากกลุ่มแฮ็กเกอร์มือใหม่ต้องการสร้างบัญชีใหม่ พวกเขาจะดาวน์โหลดหนึ่งในเครื่องมือสแกนเนอร์เหล่านี้และเรียกใช้กับเว็บไซต์จำนวนมากโดยหวังว่าจะเข้าถึงไซต์บางไซต์และทำให้เสียโฉม


บันทึกตัวอย่างเมื่อสแกนด้วยเครื่องมือ Nikto

นี่คือเหตุผลที่เซิร์ฟเวอร์และผู้ดูแลเว็บไซต์ทั้งหมดจัดการกับบันทึกกิกะไบต์ที่เต็มไปด้วยความพยายามในการรวบรวมข้อมูล ดังนั้นฉันคิดว่า...

คุณสามารถตีกลับ?

หลังจากทดลองใช้ IDS หรือ Fail2ban ที่เป็นไปได้ ผมก็นึกถึง ZIP Bomb เก่าๆ ดีๆ ในอดีต

ZIP Bomb คืออะไร?

ผลที่ได้คือ การบีบอัด ZIP นั้นยอดเยี่ยมในการจัดการกับข้อมูลที่ซ้ำซ้อน ดังนั้นหากคุณมีไฟล์ข้อความขนาดยักษ์ที่เต็มไปด้วยข้อมูลซ้ำๆ เช่นเลขศูนย์ทั้งหมด ไฟล์นั้นก็จะบีบอัดได้ดีมาก ฉันหมายถึงดีมาก

ตามที่ 42.zip แสดงให้เห็น เป็นไปได้ที่จะบีบอัด 4.5 เพตาไบต์ (4,500,000 กิกะไบต์) เป็น 42 กิโลไบต์ เมื่อคุณพยายามดูเนื้อหาของไฟล์เก็บถาวร (แตกไฟล์หรือแตกไฟล์) คุณอาจใช้พื้นที่ดิสก์หรือ RAM ทั้งหมดจนหมด

จะวางระเบิด ZIP บนเครื่องสแกนช่องโหว่ได้อย่างไร

ขออภัย เว็บเบราว์เซอร์ไม่เข้าใจ ZIP แต่เข้าใจ GZIP

สิ่งแรกที่เราจะทำคือสร้างไฟล์ GZIP ขนาด 10GB ที่เต็มไปด้วยศูนย์ คุณสามารถบีบอัดแบบซ้อนได้หลายอย่าง แต่เริ่มจากวิธีง่ายๆ ก่อน

Dd if=/dev/zero bs=1M count=10240 | gzip > 10G.gzip


สร้างระเบิดและตรวจสอบขนาดของมัน

อย่างที่คุณเห็น ขนาดของมันคือ 10 MB มันอาจจะรัดกุมกว่านี้หน่อย แต่เท่านี้ก็เพียงพอแล้วสำหรับตอนนี้

ตอนนี้เรามาติดตั้งสคริปต์ PHP ที่จะส่งไปยังไคลเอนต์

พร้อม!

ตอนนี้เราใช้มันเป็นการป้องกันอย่างง่าย:

เห็นได้ชัดว่าสคริปต์นี้ไม่ใช่ชิ้นส่วนของความสง่างาม แต่มันสามารถปกป้องเราจากสคริปต์ตัวเล็กที่กล่าวถึงก่อนหน้านี้ซึ่งไม่มีความคิดเลยว่ามันเป็นไปได้ที่จะเปลี่ยน user-agent ในโปรแกรมรวบรวมข้อมูล

ดังนั้น... จะเกิดอะไรขึ้นถ้าคุณเรียกใช้สคริปต์นี้


(หากคุณทดสอบการบอมบ์บนอุปกรณ์/เบราว์เซอร์/สคริปต์อื่น โปรด

เหตุการณ์หนึ่งที่น่าสนใจและสำคัญมากเกิดขึ้นอย่างเงียบ ๆ และมองไม่เห็นการดูถูก ประธานาธิบดีรัสเซีย วลาดิมีร์ ปูติน ได้พบและพูดคุยกับหนึ่งในผู้นำของราชการ ซึ่งชื่อไม่ค่อยปรากฏในสื่อ ไม่ บุคคลนี้ไม่ใช่สายลับ แม้ว่าโดยธรรมชาติของกิจกรรมแล้ว เขาสามารถเข้าถึงข้อมูลที่เป็นความลับได้ และอาจเรียกได้ว่าเป็น "นักสู้แห่งแนวรบล่องหน" ก็ได้ โดยทั่วไปแล้ว ปูตินได้พูดคุยกับ Andrei Artizov หัวหน้าหน่วยงานจดหมายเหตุแห่งสหพันธรัฐ

การสนทนาระหว่างประมุขแห่งรัฐและหัวหน้าหน่วยงานมีลักษณะเหมือนธุรกิจ ผลที่ตามมาอาจเกิดขึ้นในบางแห่งทำให้เกิดผลกระทบของระเบิด และในบางกรณี แม้กระทั่งการระเบิดของหัวฉีดส่วนบุคคล

ประธานาธิบดีออกแถลงการณ์อย่างไม่ใส่ใจว่าเขาได้ตัดสินใจยกเลิกการจัดประเภทเอกสารสำคัญหลายฉบับ นอกจากนี้ พระราชกฤษฎีกาจะต้องลงนามในวันเดียวกัน นอกจากนี้ ปูตินยังประกาศย้ายโรซาร์คิฟไปยังตำแหน่งใต้บังคับบัญชาโดยตรงของประธานาธิบดีรัสเซีย เนื่องจากเอกสารจำนวนมากของแผนก "มีค่าเฉพาะและมีความสำคัญระดับโลก"

ในทางกลับกัน หัวหน้าหน่วยงานได้แจ้งประธานาธิบดีว่า กองทุนจดหมายเหตุของรัสเซียได้จัดเก็บไฟล์ไว้ 500 ล้านไฟล์ และ "ไม่เคยมีการวางแผนในช่วงหลายทศวรรษที่ผ่านมา มีการจัดระบบการทำงานเกี่ยวกับการแยกประเภทออกในขณะที่กำลังดำเนินการอยู่ในขณะนี้"

ประเด็นสำคัญคือทันทีหลังจากยกเลิกการจัดประเภท เอกสารที่เก็บถาวรจะพร้อมใช้งานบนเว็บไซต์ทางการของ Russian Archive ซึ่งมีการสร้างฐานข้อมูลพิเศษแล้ว

เอกสารสำคัญที่นักประวัติศาสตร์ในประเทศและต่างประเทศเคยเลียปากมานานแล้วที่: 1400 คำสั่งเฉพาะของสตาลิน คำสั่งจากสำนักงานใหญ่ คำสั่งแนวหน้า แผนที่ปฏิบัติการ ความละเอียดและรูปถ่ายของเวลานั้น จนกระทั่งล่าสุดถูกเก็บไว้ใน เอกสารสำคัญภายใต้หัวข้อ "ความลับสุดยอด"

มีเพียงนักประวัติศาสตร์ที่ชื่นชมยินดีอย่างจริงใจขอให้พวกเขาทำงานที่สดใหม่และน่าสนใจซึ่งจะขึ้นอยู่กับเอกสารที่กล่าวถึงข้างต้น แต่การแยกประเภทจะไม่ส่งผลกระทบต่อหัวข้อประวัติศาสตร์การทหารเพียงหัวข้อเดียว

แหล่งข่าวที่ใกล้ชิดกับ Russian Archives ให้รายละเอียดที่น่าสนใจ: “เท่าที่ฉันรู้จากข้อมูลของแผนกเอกสารสำคัญ นี่เป็นช่วงเวลาระหว่างปี 1930 ถึง 1989 มีหลายกรณีขอโทษของผู้แจ้งข่าว - เช่นเดียวกับการอดกลั้นอย่างไร้เดียงสาด้วยนามสกุลที่น่าสนใจมาก จะมีข้อมูลเกี่ยวกับการพัฒนาอวกาศและทางทหารที่สามารถรายงานได้แล้ว นอกจากนี้ ข้อมูลเกี่ยวกับเส้นทางการต่อสู้ คำสั่ง และข่าวกรองที่ได้รับระหว่างมหาสงครามแห่งความรักชาติ ตลอดจนความสัมพันธ์ระหว่างรัฐระหว่างสงครามเย็นกำลังถูกยกเลิกการจัดประเภท

และเขากล่าวเสริมอย่างหนักแน่นว่า “เอกสารบางฉบับจะทำให้สังคมประหลาดใจ คุณจำเป็นต้องรู้ประวัติของคุณเองไม่ว่าจะเป็นอะไรก็ตาม

หอจดหมายเหตุมีหน่วยความจำที่ยาวนานและมีประจุที่อาจเกิดขึ้นได้ไม่เลวร้ายไปกว่าระเบิดไฮโดรเจน ไม่ใช่เรื่องบังเอิญที่ในประเทศของเรา "กรณีของเจ้าหน้าที่" และ "กรณีของแพทย์" ยังคงถูกจัดประเภท เป็นเวลานานสร้างเหตุผลสำหรับการเก็งกำไรทุกประเภท ไม่นานมานี้ ในสหราชอาณาจักร คณะกรรมาธิการพิเศษเกี่ยวกับเอกสารที่เก็บถาวรซึ่งระยะเวลาการเก็บเป็นความลับกำลังจะสิ้นสุดลง แต่มีการตัดสินใจที่จะขยายระบอบการรักษาความลับออกไปอีก 50 ปีโดยอิงจากข้อมูลการติดต่อก่อนสงครามของหน่วยข่าวกรองอังกฤษกับ นาซี SD

การจองเกี่ยวกับ "เอกสารบางอย่างจะทำให้สาธารณชนประหลาดใจ" ไม่ใช่เรื่องบังเอิญ ในช่วงปลายทศวรรษ 1980 ทั้งในรัสเซียและในสาธารณรัฐของอดีตสหภาพโซเวียต ผู้คนจำนวนมากเข้ามามีอำนาจบนคลื่นของ "การทำให้เป็นประชาธิปไตย"

หลายคนแสดงความมีชีวิตชีวาทางการเมืองที่น่าอัศจรรย์ แม้จะขาดความสามารถในการบริหารจัดการและแนวโน้มที่จะสอนประชาชนเกี่ยวกับประชาธิปไตยจากมุมมองของพวกเขา

ในต่างประเทศใกล้ ๆ อดีตผู้นำของ "แนวร่วมยอดนิยม" ซึ่งเปลี่ยนโลกทัศน์จากการต่อต้านโซเวียตเป็นต่อต้านรัสเซีย ยึดอำนาจอย่างแน่นหนาและกำลังดำเนินนโยบายที่ไม่เป็นมิตรต่อรัสเซียจากดินแดนของพวกเขา - จากการจัดการประชุมทุกประเภท ถูกขับไล่ออกจาก "โอเพ่นรัสเซีย" ไปฝึกกลุ่มติดอาวุธโปรฟาสซิสต์และให้ความช่วยเหลือทางทหารแบนเดรา

ประชาคมยุโรป เช่นเดียวกับพลเมืองของขอบเขตจำกัดเหล่านี้จะสนใจที่จะเรียนรู้จากเอกสารที่ไม่เป็นความลับอีกต่อไปของ Rosaarchive ซึ่งใน "Euro-democrats" ที่น่าสังเกตคือผู้แจ้งข่าวของ KGB มีข่าวลือว่าอดีตผู้นำแนวรบแห่งชาติของลิทัวเนีย Landsbergis และประธานาธิบดีมาดาม Dalia Grybauskaite คนปัจจุบัน "เคาะ" ที่ KGB ในช่วงเวลาของเยาวชนที่มีหมอกหนา - โลกเต็มไปด้วย ฉันเชื่อว่าด้านนี้ของชีวประวัติของพวกเขาจะสามารถเรียนรู้จากแหล่งข้อมูลดั้งเดิมได้

คุณสามารถนินทาว่า "นานมาแล้วและไม่เป็นความจริง", "อดีตเติบโตขึ้น" มากเท่าที่คุณต้องการ แต่อย่าประมาทพลังทำลายล้างของการเปิดเผยดังกล่าว

จำได้ว่าปีที่แล้วชุดเอกสารที่สถาบันการรำลึกถึงแห่งชาติค้นพบเกี่ยวกับความร่วมมือของ Lech Walesa (ภายใต้การกระตุ้นของการผ่าตัด "Bolek") ถูกฉีกขาดอย่างน่าทึ่งในสื่อโปแลนด์ท่ามกลางกิจกรรมของเขาที่ Gdansk อู่ต่อเรือ การระเบิดของข้อมูลไม่ได้ทำให้หินแตกในภาพไอคอน "เสาหมายเลข 1" ผู้นำแห่งความเป็นปึกแผ่น ผู้ได้รับรางวัลโนเบลสาขาสันติภาพ และประธานาธิบดีคนแรกของโปแลนด์ที่ต่อต้านโซเวียต ต่อจากนี้ไป วาเลซ่า เป็นเพียงชายชราอ้วนหนวดเครา ยุคอดีต ที่ความอัปยศเห็นได้ด้วยตาตนเองในรูปของรายรับ 17 ฉบับ ที่จัดเก็บไว้ในสถาบันแห่งความทรงจำแห่งชาติเดียวกันเพื่อรับเงินจากการเคาะ -ข้อมูลเคาะโอนไปยังบริการพิเศษ

มีเพียงคนเดียวที่เสียใจที่ "ระเบิด" จดหมายเหตุไม่ระเบิดภายใต้ตัวแทน "โบเล็ก" ในปี 1980 เมื่อเขาและ "สมานฉันท์" ของเขาซึ่งร้องเพลงกับหน่วยข่าวกรองตะวันตกเขย่าโปแลนด์นักสังคมนิยม

ความประหลาดใจที่น่าสนใจมากมายสามารถรอพวกเสรีนิยมในประเทศได้เช่นกัน เส้นทางชีวิตที่คดเคี้ยวของพวกเขามีหลายวิธีคล้ายกับเส้นทางของ Walesa สู่จุดสูงสุดของอำนาจ ด้วยความเสียใจอย่างสุดซึ้งของเรา KGB จึงไม่รีบเร่งที่จะเปิดเผยข้อมูลผู้ให้ข้อมูลที่ได้รับการปฏิรูปด้วยเหตุผลหลายประการ โดยที่ผู้ให้ข้อมูลที่มีจริยธรรมไม่ได้อยู่ในสถานที่สุดท้าย ท้ายที่สุดถ้าคุณเปิดเผยตัวแทนโดยเฉพาะอย่างยิ่งผู้สมัครใจใครจะให้ความร่วมมือ? คุณจะไม่พลาดกับตัวแทนที่ถูกจับในการกระทำที่ไม่เหมาะสมและคัดเลือกบนพื้นฐานนี้

ข้อมูลอย่างไม่เป็นทางการเปิดเผยผ่านสื่อว่า "บุคคลสำคัญของขบวนการเสรีนิยมประชาธิปไตยในรัสเซีย" ร่วมมือกับหน่วยสืบราชการลับของสหภาพโซเวียตโดยสมัครใจ เกิดจากแรงจูงใจที่เห็นแก่ตัว: การเดินทางเพื่อธุรกิจที่น่าสนใจ ความก้าวหน้าในอาชีพ งานอันทรงเกียรติ ฯลฯ

ใครจะจินตนาการได้ว่างูพิษชนิดใดเป็นสมาคมที่สร้างสรรค์ต่างๆ ของนักเขียน นักแสดงละคร และผู้สร้างภาพยนตร์

สำหรับนักวิจารณ์หลายคนของสหภาพโซเวียตและระบบโซเวียต พ่อแม่ไม่ได้เป็นเพียงพรรคที่โดดเด่นหรือบุคคลสำคัญทางเศรษฐกิจเท่านั้น แต่ยังทำหน้าที่ในร่างกายของ NKVD-MGB-KGB และมีส่วนส่วนตัวในการปราบปรามด้วย

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

หอจดหมายเหตุที่ไม่เป็นความลับอีกต่อไปสามารถมีอิทธิพลต่อการจัดแนวกองกำลังในโจรยูเครน เราสามารถจำได้ว่าเอกสารจำนวนหนึ่งที่เผยแพร่บนโซเชียลเน็ตเวิร์กโดย Miroslava Berdnik แม้กระทั่งก่อนการทำรัฐประหาร Maidan เกี่ยวกับความร่วมมือของผู้นำ OUN กับกระทรวงความมั่นคงแห่งรัฐและกระทรวงกิจการภายในทำให้เกิดความวุ่นวายและน้ำพุของ ท้องเสียในหมู่แฟน ๆ ของ Bandera ที่ตายแล้ว ชาว Svidomites สาปแช่งเรียกสำเนาเอกสารว่า "FB ปลอม" แต่พวกเขาไม่สามารถโต้แย้งด้วยเหตุผลใด ๆ

ทำไมมันถึงสำคัญ? ลัทธิชาตินิยมหัวรุนแรงของยูเครนนั้นชั่วร้ายโดยไม่มีการสงวนไว้ แต่เป็นที่ยอมรับจากคนหลากหลาย ในบรรดาสมาชิก OUN สมัยใหม่นั้น มีนักอุดมคติในตัวเองที่ต้องการกำจัดลัทธิชาตินิยมยูเครนจากบุคคลที่น่ารังเกียจที่สุดของ Bandera และ Shukhevych เนื่องจากพวกเขาได้ประนีประนอมตัวเองในฐานะหุ่นเชิดและผู้ลงทัณฑ์ของฮิตเลอร์อย่างไม่อาจแก้ไขได้ แต่หน่วยข่าวกรองโซเวียตหลังสงครามเข้าใจดีถึงความรู้สึกของชาตินิยมเยอรมันที่แยกตัวออกจากพวกนาซีและผู้สนับสนุนนายพลเกเลนซึ่งตกอยู่ใต้อำนาจของอเมริกาอย่างชัดเจน ผู้รักชาติชาวเยอรมันซึ่งถือว่าบิสมาร์กเป็นไอดอลของพวกเขาหลังจากรอดชีวิตจากสงครามที่น่าสะพรึงกลัวและเห็นว่าชาวอเมริกันกำลังผลักดัน FRG ให้เข้าสู่สงครามครั้งใหม่กับสหภาพโซเวียตชอบที่จะทำงานให้กับหน่วยข่าวกรองโซเวียตและเยอรมันตะวันออก ประเด็นนี้คุ้มค่าที่จะพิจารณาอย่างแน่นอน

ในทางกลับกัน ยูเครนเต็มไปด้วย neo-Banderists ที่กระตือรือร้นซึ่งไม่ต้องทนทุกข์ทรมานจากความขยะแขยงมากเกินไปซึ่งไม่กลัวหลักฐานเอกสารใด ๆ เกี่ยวกับความร่วมมือของไอดอลของพวกเขากับหน่วยสืบราชการลับของนาซี และจะเกิดอะไรขึ้นหากเอกสารที่ไม่เป็นความลับถูกตีพิมพ์โดยบอกว่าไอดอลของพวกเขาเช่น Vasil Kuk รั่วไหลข้อมูลไปยัง MGB เกี่ยวกับ "พี่น้อง" ของพวกเขาที่นั่งอยู่ในแคช?

เกิดอะไรขึ้นถ้าปรากฎว่า "ฝ่ายขวา" และ "สี่เหลี่ยม" ทุกประเภทของยุคโซเวียตตอนปลายเคาะ KGB เพื่อทำให้ระบอบการจำคุกอ่อนลงสำหรับเบคอนเพิ่มเติมจากบ้านหรือขนปุยจาก คอกค่าย? "spilnota" ของ Bandera ที่เห็นทุกหนทุกแห่งในมือยาวของมอสโก FSB และปูตินจะยืนหยัดในการทดสอบความแข็งแกร่งของความเชื่อมั่นหรือไม่?

ข้อมูลประเภทนี้สามารถทำให้เกิดการปล่อยพลาสมาเทอร์โมนิวเคลียร์ที่ทรงพลังจาก Svidomo dups ซึ่งเป็นเจ้าของที่มี "ความบริสุทธิ์ของชาติ" และ "Svidomo" การเปิดเผยของไอดอลสามารถทำให้ใครบางคนหดตัวและเปลี่ยนความคิดของพวกเขา

เป็นเรื่องที่น่าสนใจที่จะเรียนรู้เกี่ยวกับชีวิตคู่ของผู้นำของ "Mejlis" ที่ประกาศตัวเองรวมถึงบุคคลเลวทรามอื่น ๆ ที่อิดโรยภายใต้ภาระของ "มโนธรรมของชาติ" โดยพลการ

ดังนั้น "ระเบิด" จดหมายเหตุฉบับแรกจะระเบิดภายใต้ก้นส่วนตัวของใคร? ใครจะไปกับ "หัวรถจักร" ที่คลี่คลายห่วงโซ่ยาวของการเปิดเผย?


* 42.zip มีสองเวอร์ชัน: เวอร์ชันเก่า 42,374 ไบต์ และเวอร์ชันใหม่กว่า 42,838 ไบต์ ข้อแตกต่างคือรหัสผ่านใหม่ต้องใช้รหัสผ่านก่อนแกะกล่อง เราเปรียบเทียบกับรุ่นเก่าเท่านั้น นี่คือสำเนาของไฟล์หากคุณต้องการ: 42.zip

Zip bomb ต้องเอาชนะข้อเท็จจริงที่ว่าอัลกอริธึมการบีบอัด DEFLATE ที่ parsers รองรับมากที่สุดต้องไม่เกินอัตราส่วนการบีบอัดที่ 1032 ต่อ 1 ด้วยเหตุนี้ zip bomb จึงมักอาศัยการบีบอัดแบบเรียกซ้ำโดยการซ้อนไฟล์ zip ภายในไฟล์ zip เพื่อให้ได้อัตราส่วนพิเศษ 1032 กับแต่ละชั้น แต่เคล็ดลับนี้ใช้ได้เฉพาะในการใช้งานที่แกะแบบวนซ้ำเท่านั้น และส่วนใหญ่ไม่ทำ ระเบิด 42.zip ที่มีชื่อเสียงที่สุดจะขยายเป็น 4.5PB ที่น่าเกรงขามเมื่อทั้งหกชั้นถูกคลายการบีบอัดซ้ำ แต่มี 0.6MB ที่เลวทรามต่ำช้าที่ชั้นบนสุด Zip quines เช่นเดียวกับของ Cox และ Ellingsen สร้างสำเนาของตัวเองและขยายไปเรื่อย ๆ เมื่อคลายการบีบอัดแบบเรียกซ้ำ แต่ยังปลอดภัยอย่างสมบูรณ์เมื่อแกะกล่องครั้งเดียว

บทความนี้แสดงวิธีสร้าง zip bomb แบบไม่เรียกซ้ำซึ่งมีอัตราส่วนการบีบอัดเกินขีดจำกัด DEFLATE ที่ 1032 ซึ่งทำงานโดยการซ้อนทับไฟล์ภายในคอนเทนเนอร์ zip เพื่ออ้างถึง "แกนกลาง" ของข้อมูลที่มีการบีบอัดสูงในหลายไฟล์โดยไม่ต้องทำสำเนาหลายชุด ขนาดเอาต์พุตของ zip bomb เพิ่มขึ้นเป็นสองเท่าจากขนาดอินพุต กล่าวคือ อัตราส่วนการอัดจะเพิ่มขึ้นเมื่อขนาดของระเบิดเพิ่มขึ้น การออกแบบขึ้นอยู่กับคุณสมบัติของ zip และ DEFLATE: ไม่สามารถเคลื่อนย้ายไปยังรูปแบบไฟล์อื่นหรืออัลกอริธึมการบีบอัดโดยตรง Bomb เข้ากันได้กับโปรแกรมแยกวิเคราะห์ zip ส่วนใหญ่ ยกเว้นตัวแยกวิเคราะห์ "สตรีม" ซึ่งแยกวิเคราะห์ไฟล์ในครั้งเดียวโดยไม่ต้องตรวจสอบไดเรกทอรีกลางของไฟล์ zip เราพยายามสร้างสมดุลระหว่างสองเป้าหมายที่ขัดแย้งกัน:

  • เพิ่มอัตราการบีบอัด เรากำหนดอัตราส่วนการบีบอัดเป็นผลรวมของขนาดของไฟล์ทั้งหมดในไฟล์เก็บถาวร หารด้วยขนาดของไฟล์ zip เอง ไม่รวมชื่อไฟล์หรือข้อมูลเมตาของระบบไฟล์อื่นๆ เฉพาะเนื้อหาเท่านั้น
  • รักษาความเข้ากันได้ Zip เป็นรูปแบบที่ซับซ้อนและตัวแยกวิเคราะห์ต่างกัน โดยเฉพาะอย่างยิ่งในกรณีที่มีขอบและคุณสมบัติเพิ่มเติม อย่าใช้ลูกเล่นที่ใช้ได้กับโปรแกรมแยกวิเคราะห์บางตัวเท่านั้น เราจะสังเกตวิธีการบางอย่างในการปรับปรุงประสิทธิภาพของ zip bomb โดยสูญเสียความเข้ากันได้

โครงสร้างไฟล์ซิป

ไฟล์ Zip ประกอบด้วย ไดเรกทอรีกลางลิงก์ไปยัง ไฟล์.

ไดเร็กทอรีส่วนกลางอยู่ที่ส่วนท้ายของไฟล์ zip นี่คือรายการ ส่วนหัวไดเรกทอรีกลาง. ส่วนหัวไดเร็กทอรีส่วนกลางแต่ละอันมีข้อมูลเมตาของไฟล์เดียว เช่น ชื่อไฟล์และการตรวจสอบ CRC-32 และแบ็คพอยเตอร์ไปยังส่วนหัวของไฟล์ในเครื่อง ส่วนหัวของไดเร็กทอรีส่วนกลางมีความยาว 46 ไบต์บวกกับความยาวของชื่อไฟล์

ไฟล์ประกอบด้วยส่วนหัวของไฟล์ในเครื่อง ตามด้วยข้อมูลไฟล์บีบอัด ความยาวของส่วนหัวของไฟล์ในเครื่องคือ 30 ไบต์บวกกับความยาวของชื่อไฟล์ ประกอบด้วยสำเนาซ้ำซ้อนของข้อมูลเมตาจากส่วนหัวของไดเรกทอรีกลาง และขนาดของไฟล์ข้อมูลที่บีบอัดและไม่บีบอัดที่อยู่เบื้องหลัง Zip เป็นรูปแบบคอนเทนเนอร์ ไม่ใช่อัลกอริธึมการบีบอัด ข้อมูลของแต่ละไฟล์ถูกบีบอัดโดยใช้อัลกอริทึมที่ระบุในข้อมูลเมตา ซึ่งมักจะเป็น DEFLATE

คำอธิบายของรูปแบบ zip นี้ละเว้นรายละเอียดมากมายที่ไม่จำเป็นเพื่อทำความเข้าใจกับ zip bomb ดูหัวข้อ 4.3 APPNOTE.TXT หรือ "โครงสร้างไฟล์ PKZip" ของ Florian Buchholz สำหรับรายละเอียดทั้งหมด หรือดู

ความซ้ำซ้อนและความคลุมเครือมากมายในรูปแบบ zip เปิดโอกาสในการก่อความเสียหายทุกประเภท ซิปบอมบ์เป็นเพียงส่วนเล็กๆ ของภูเขาน้ำแข็ง ลิงค์สำหรับอ่านเพิ่มเติม:

$ python3 -m zipfile -e overlap.zip Traceback (การโทรล่าสุดครั้งล่าสุด): ... __main__.BadZipFile: ชื่อไฟล์ในไดเร็กทอรี "B" และส่วนหัว b"A" ต่างกัน
ต่อไป เราจะมาดูวิธีการแก้ไขโครงสร้างเพื่อความสอดคล้องของชื่อไฟล์ในขณะที่ยังคงประโยชน์ส่วนใหญ่ของไฟล์ที่ทับซ้อนกัน

การค้นพบครั้งที่สอง: การอ้างอิงส่วนหัวของไฟล์ในเครื่อง

เราจำเป็นต้องแยกส่วนหัวของไฟล์ในเครื่องสำหรับแต่ละไฟล์ ในขณะที่ยังคงใช้หนึ่งคอร์ซ้ำ การต่อส่วนหัวทั้งหมดเข้าด้วยกันนั้นใช้ไม่ได้ผล เนื่องจากโปรแกรมแยกวิเคราะห์ zip จะพบส่วนหัวของไฟล์ในเครื่องนั้นที่คาดว่าสตรีม DEFLATE จะเริ่มทำงาน แต่แนวคิดนี้จะได้ผล โดยมีการเปลี่ยนแปลงเล็กน้อย เราจะใช้ฟังก์ชัน DEFLATE ของบล็อกที่ไม่บีบอัดเพื่อ "อ้าง" ส่วนหัวของไฟล์ในเครื่อง เพื่อให้ดูเหมือนเป็นส่วนหนึ่งของสตรีม DEFLATE เดียวกันที่สิ้นสุดในเคอร์เนล ส่วนหัวของไฟล์ในเครื่องแต่ละไฟล์ (ยกเว้นอันแรก) จะถูกตีความในสองวิธี: เป็นโค้ด (ส่วนหนึ่งของโครงสร้างไฟล์ zip) และเป็นข้อมูล (ส่วนหนึ่งของเนื้อหาไฟล์)

สตรีม DEFLATE คือลำดับของบล็อก ซึ่งแต่ละบล็อกสามารถบีบอัดหรือคลายการบีบอัดได้ เรามักจะนึกถึงบล็อกที่ถูกบีบอัดเท่านั้น ตัวอย่างเช่น เคอร์เนลคือบล็อกขนาดใหญ่ที่มีการบีบอัด แต่ยังมีไฟล์ที่ไม่บีบอัดซึ่งขึ้นต้นด้วยส่วนหัวขนาด 5 ไบต์พร้อมฟิลด์ความยาว ซึ่งหมายความว่า "พิมพ์สิ่งต่อไปนี้ ไบต์ต่อคำต่อคำ การขยายขนาดบล็อกที่ไม่บีบอัดหมายถึงการลบส่วนหัวขนาด 5 ไบต์เท่านั้น บล็อกที่บีบอัดและไม่บีบอัดสามารถผสมกันได้อย่างอิสระในสตรีม DEFLATE ผลลัพธ์คือการต่อผลลัพธ์ของการคลายบล็อคทั้งหมดตามลำดับ คำว่า "uncompressed" มีความเกี่ยวข้องเฉพาะที่ระดับ DEFLATE เท่านั้น ข้อมูลไฟล์ยังถือว่า "บีบอัด" ที่ระดับ zip ไม่ว่าจะใช้บล็อกใดก็ตาม

วิธีที่ง่ายที่สุดในการพิจารณาโครงสร้างนี้คือเป็นการทับซ้อนกันภายในตั้งแต่ไฟล์สุดท้ายไปจนถึงไฟล์แรก เราเริ่มต้นด้วยการแทรกเคอร์เนลที่จะสร้างจุดสิ้นสุดของไฟล์ข้อมูลสำหรับแต่ละไฟล์ การเพิ่มส่วนหัวไฟล์ LFH ในเครื่อง นู๋และชื่อของไดเร็กทอรีกลางCDH นู๋ซึ่งชี้ไปที่มัน ตั้งค่าฟิลด์ข้อมูลเมตาขนาดที่บีบอัดเป็น LFH นู๋และ CDH นู๋ตามขนาดที่บีบอัดของเคอร์เนล ตอนนี้เราเพิ่มส่วนหัวบล็อกที่ไม่มีการบีบอัดขนาด 5 ไบต์ (ในแผนภาพสีเขียว) ฟิลด์ความยาวซึ่งเท่ากับขนาดของ LFH นู๋. การเพิ่มส่วนหัวไฟล์ LFH ในเครื่องที่สอง นู๋-1 และส่วนหัวไดเรกทอรีกลาง CDH นู๋-1 ซึ่งชี้ไปที่มัน ตั้งค่าฟิลด์ข้อมูลเมตา "ขนาดที่บีบอัด" เป็นส่วนหัวขนาดบีบอัดของเคอร์เนลใหม่ เป็นบวกขนาดส่วนหัวบล็อกที่ไม่บีบอัด (5 ไบต์) เป็นบวกขนาด LFH นู๋ .

ในขณะนี้ ไฟล์ zip มีสองไฟล์ชื่อ Y และ Z เรามาดูกันว่า parser จะเห็นอะไรเมื่อแยกวิเคราะห์ สมมติว่าขนาดเคอร์เนลที่บีบอัดคือ 1000 ไบต์และขนาด LFH คือ นู๋- 31 ไบต์ เริ่มต้นด้วย CDH นู๋-1 และปฏิบัติตามตัวชี้ไปที่LFH นู๋-1 . ชื่อของไฟล์แรกคือ Y และขนาดที่บีบอัดของไฟล์ข้อมูลคือ 1,036 ไบต์ เมื่อตีความ 1036 ไบต์ถัดไปเป็นสตรีม DEFLATE เราจะพบส่วนหัวบล็อกที่ไม่มีการบีบอัดขนาด 5 ไบต์ที่ระบุว่าจะคัดลอก 31 ไบต์ถัดไป เขียน 31 ไบต์ถัดไปซึ่งก็คือLFH นู๋ซึ่งเราขยายและเพิ่มลงในไฟล์ Y ต่อไปในสตรีม DEFLATE เราจะพบบล็อกที่ถูกบีบอัด (เคอร์เนล) ซึ่งเราคลายการบีบอัดเป็นไฟล์ Y ตอนนี้เรามาถึงจุดสิ้นสุดของข้อมูลที่บีบอัดแล้วและเสร็จสิ้นด้วยไฟล์ Y

ย้ายไปยังไฟล์ถัดไปเราทำตามตัวชี้จากCDH นู๋สู่ LFH นู๋และค้นหาไฟล์ชื่อ Z ซึ่งมีขนาดบีบอัด 1,000 ไบต์ ด้วยการตีความ 1,000 ไบต์เหล่านี้เป็นสตรีม DEFLATE เราพบบล็อกที่ถูกบีบอัดทันที (เคอร์เนลอีกครั้ง) และแตกไฟล์เป็นไฟล์ Z ตอนนี้เรามาถึงจุดสิ้นสุดของไฟล์สุดท้ายและเสร็จสิ้นแล้ว ไฟล์เอาต์พุต Z มีเคอร์เนลที่คลายการแพ็ก ไฟล์เอาต์พุต Y เหมือนกัน แต่นำหน้าด้วย 31 ไบต์ LFH นู๋ .

เราสร้างเสร็จแล้วโดยทำซ้ำขั้นตอนการเสนอราคาจนกว่าไฟล์ zip จะมีจำนวนไฟล์ที่ต้องการ ไฟล์ใหม่แต่ละไฟล์จะเพิ่มส่วนหัวไดเรกทอรีกลาง ส่วนหัวของไฟล์ในเครื่อง และบล็อกที่ไม่บีบอัดเพื่ออ้างอิงส่วนหัวของไฟล์ในเครื่องที่ตามมาทันที ข้อมูลไฟล์ที่บีบอัดมักจะเป็นลูกโซ่ของบล็อก DEFLATE ที่ไม่มีการบีบอัด (ส่วนหัวของไฟล์ที่อ้างถึงในเครื่อง) ตามด้วยเคอร์เนลที่ถูกบีบอัด แต่ละไบต์ในเคอร์เนลมีส่วนสนับสนุนประมาณ 1032 นู๋ถึงขนาดเอาต์พุต เพราะแต่ละไบต์เป็นส่วนหนึ่งของทั้งหมด นู๋ไฟล์. ไฟล์เอาท์พุตมีขนาดต่างกันด้วย: ไฟล์ที่เก่ากว่าจะใหญ่กว่าไฟล์หลังๆ เนื่องจากมีการอ้างอิงส่วนหัวของไฟล์ในเครื่องมากกว่า เนื้อหาของไฟล์เอาต์พุตไม่สมเหตุสมผลนัก แต่ไม่มีใครบอกว่าควร

โครงสร้างการเสนอราคาที่ทับซ้อนกันนี้มีความเข้ากันได้ดีกว่าโครงสร้างที่ทับซ้อนกันทั้งหมดจากส่วนก่อนหน้า แต่ความเข้ากันได้ต้องแลกกับต้นทุนของการบีบอัด ไฟล์ที่เพิ่มเข้ามาแต่ละไฟล์มีค่าเฉพาะส่วนหัวของไดเรกทอรีกลางเท่านั้น ที่นี่จึงคุ้มกับส่วนหัวของไดเรกทอรีกลาง ส่วนหัวของไฟล์ในเครื่อง และอีก 5 ไบต์สำหรับส่วนหัวการอ้างอิง

การเพิ่มประสิทธิภาพ

เมื่อได้รับการออกแบบพื้นฐานของ zip bomb เราจะพยายามทำให้มันมีประสิทธิภาพมากที่สุด เราต้องการตอบคำถามสองข้อ:
  • อัตราการบีบอัดสูงสุดสำหรับขนาดไฟล์ zip ที่กำหนดคือเท่าใด
  • อัตราการบีบอัดสูงสุดตามข้อจำกัดของรูปแบบ zip คือเท่าใด

การบีบอัดแกน

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

โปรแกรมเก็บถาวร DEFLATE ที่เหมาะสมทั้งหมดใช้อัตราส่วนการบีบอัดที่ 1,032 ในสตรีมซ้ำๆ กันไม่รู้จบ แต่เราใส่ใจเกี่ยวกับขนาดเฉพาะ ในขนาดไฟล์เก็บถาวรของเรา bulk_deflate จะเก็บข้อมูลมากกว่าตัวเก็บถาวรทั่วไป: มากกว่า zlib และ Info-ZIP ประมาณ 26 KB และมากกว่า Zopfli ประมาณ 15 KB ซึ่งลดความเร็วลงเพื่อคุณภาพการบีบอัด

ค่าใช้จ่ายของอัตราการบีบอัด bulk_deflate ที่สูงคือการขาดความคล่องตัว สามารถบีบอัดสตริงของไบต์ที่ซ้ำกันและมีความยาวได้เพียงบางส่วนเท่านั้นคือ 517 + 258 kสำหรับจำนวนเต็ม k≥ 0 นอกจากการบีบอัดที่ดีแล้ว bulk_deflate ยังทำงานได้รวดเร็ว โดยทำงานเกือบจะพร้อมกันโดยไม่คำนึงถึงขนาดของข้อมูลอินพุต นอกเหนือจากงานเขียนสตริงที่บีบอัดจริงๆ

ชื่อไฟล์

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

แต่ละไบต์ที่ใช้กับชื่อไฟล์หมายถึงสองไบต์ที่ไม่ได้ใช้บนเคอร์เนล (สองไบต์เนื่องจากแต่ละชื่อไฟล์ปรากฏสองครั้ง: ในส่วนหัวของไดเร็กทอรีส่วนกลางและในส่วนหัวของไฟล์ในเครื่อง) ไบต์ชื่อไฟล์จะส่งผลให้ ( นู๋+ 1) / 4 ไบต์ของเอาต์พุต ในขณะที่ไบต์ในเคอร์เนลนับเป็น 1032 นู๋. ตัวอย่าง: , , .

การพิจารณาความเข้ากันได้ครั้งแรกคือการเข้ารหัส ข้อกำหนดรูปแบบ zip ระบุว่าควรตีความชื่อไฟล์เป็น CP 437 หรือ UTF-8 หากมีการตั้งค่าแฟล็กบิต (APPNOTE.TXT, ภาคผนวก D) นี่คือประเด็นหลักของความไม่ลงรอยกันระหว่างโปรแกรมแยกวิเคราะห์ zip ซึ่งสามารถตีความชื่อไฟล์ในการเข้ารหัสแบบคงที่หรือเฉพาะบางภาษา ดังนั้น เพื่อความเข้ากันได้ เป็นการดีกว่าที่จะจำกัดตัวเองให้อยู่ที่อักขระที่มีการเข้ารหัสเหมือนกันทั้งใน CP 437 และ UTF-8 กล่าวคือ มีอักขระ US-ASCII ที่พิมพ์ได้ 95 ตัว

เรายังถูกผูกมัดด้วยข้อจำกัดการตั้งชื่อระบบไฟล์ ระบบไฟล์บางระบบไม่คำนึงถึงขนาดตัวพิมพ์ ดังนั้น "a" และ "A" จึงไม่ถือว่าเป็นชื่อที่แตกต่างกัน ระบบไฟล์ทั่วไป เช่น FAT32 ไม่อนุญาตอักขระบางตัว เช่น "*" และ "?"

zip bomb ของเราจะใช้ชื่อไฟล์จากตัวอักษร 36 ตัวซึ่งไม่มีอักขระตัวพิมพ์พิเศษหรือตัวพิมพ์ผสม เพื่อความปลอดภัย แต่ไม่จำเป็นต้องประนีประนอมอย่างเหมาะสมที่สุด

0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
ชื่อไฟล์จะถูกสร้างขึ้นในลักษณะที่ชัดเจน โดยตำแหน่งทั้งหมดจะถูกเพิ่มเข้าไปที่ส่วนท้ายของลูป:

"0", "1", "2", …, "Z", "00", "01", "02", …, "0Z", …, "Z0", "Z1", "Z2", …, "ZZ", "000", "001", "002", …
มี 36 ชื่อไฟล์ที่มีความยาวหนึ่งอักขระ 362 ชื่อไฟล์ที่มีความยาวสองอักขระ เป็นต้น สี่ไบต์เพียงพอสำหรับชื่อไฟล์ที่แตกต่างกัน 1,727,604 ชื่อ

เมื่อพิจารณาว่าชื่อไฟล์ในไฟล์เก็บถาวรมักจะมีความยาวต่างกัน วิธีใดดีที่สุดในการสั่งซื้อ: จากสั้นที่สุดไปยาวที่สุด หรือในทางกลับกัน ถ้าคุณลองคิดดูสักนิด ทางที่ดีควรใส่ชื่อที่ยาวที่สุดไว้ท้ายๆ การเรียงลำดับนี้เพิ่มเอาต์พุตมากกว่า 900MB ให้กับ zblg.zip เมื่อเทียบกับการสั่งซื้อที่ยาวที่สุดและสั้นที่สุด อย่างไรก็ตาม นี่เป็นการปรับให้เหมาะสมเล็กน้อย เนื่องจาก 900 MB เป็นเพียง 0.0003% ของขนาดปัญหาทั้งหมด

ขนาดเคอร์เนล

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

ในการหาสมดุลที่เหมาะสมที่สุด คุณต้องปรับให้เหมาะสมเพียงหนึ่งตัวแปร นู๋, จำนวนไฟล์ในไฟล์ zip ทุกค่า นู๋ต้องการจำนวนโอเวอร์เฮดสำหรับส่วนหัวไดเร็กทอรีส่วนกลาง ส่วนหัวของไฟล์ในเครื่อง ส่วนหัวของบล็อกการอ้างอิง และชื่อไฟล์ พื้นที่ที่เหลือจะถูกครอบครองโดยแกนกลาง เพราะว่า นู๋ต้องเป็นจำนวนเต็ม และคุณสามารถใส่ไฟล์ได้จำนวนหนึ่งเท่านั้นก่อนที่ขนาดคอร์จะลดลงเหลือศูนย์ เพียงตรวจสอบทุกค่าที่เป็นไปได้ นู๋แล้วเลือกอันที่ให้ผลลัพธ์มากที่สุด

การนำขั้นตอนการเพิ่มประสิทธิภาพไปใช้กับ X= 42 374 สำหรับ 42.zip ค้นหาค่าสูงสุดที่ นู๋= 250 ไฟล์ 250 ไฟล์เหล่านี้ต้องการโอเวอร์เฮด 21,195 ไบต์ เหลือ 21,179 ไบต์สำหรับเคอร์เนล เคอร์เนลขนาดนี้จะแตกออกเป็น 21,841,249 ไบต์ (อัตราส่วน 1031.3 ต่อ 1) เคอร์เนลที่คลายการบีบอัดจำนวน 250 สำเนา บวกกับส่วนหัวของไฟล์ในเครื่องที่ยกมา ให้เอาต์พุตที่คลายการบีบอัดทั้งหมด 5,461,307,620 ไบต์ และอัตราส่วนการบีบอัดที่ 129,000

CRC-32 สามารถสร้างแบบจำลองเป็นเครื่องสถานะที่อัพเดตการลงทะเบียนสถานะแบบ 32 บิตสำหรับแต่ละบิตอินพุต การดำเนินการอัพเดตพื้นฐานสำหรับบิต 0 และ 1 คือ:

Uint32 crc32_update_0(uint32 state) ( // เลื่อนบิตที่มีนัยสำคัญน้อยที่สุดออก bit b = state & 1; state = state >> 1; // ถ้าบิต shifted-out เป็น 1, XOR ที่มีค่าคงที่ CRC-32 ถ้า (b == 1) state = state ^ 0xedb88320; return state; ) uint32 crc32_update_1(uint32 state) ( // ทำเป็น 0 บิต จากนั้น XOR ด้วยค่าคงที่ CRC-32 return crc32_update_0(state) ^ 0xedb88320; )
หากคุณแสดงการลงทะเบียนสถานะเป็นเวกเตอร์ไบนารี 32 องค์ประกอบ และใช้ XOR สำหรับการบวกและการคูณ ดังนั้น crc32_update_0 จะเป็นการจับคู่เชิงเส้น กล่าวคือ มันสามารถแสดงเป็นการคูณด้วยเมทริกซ์การเปลี่ยนแปลงแบบไบนารี 32x32 หากต้องการทราบสาเหตุ โปรดทราบว่าการคูณเมทริกซ์ด้วยเวกเตอร์นั้นเป็นการสรุปคอลัมน์ของเมทริกซ์หลังจากคูณแต่ละคอลัมน์ด้วยองค์ประกอบที่สอดคล้องกันของเวกเตอร์ สถานะการดำเนินการกะ >> 1 ง่าย ๆ แต่ละบิต ผมรัฐเวกเตอร์และคูณด้วยเวกเตอร์ที่เป็นศูนย์ทุกที่ยกเว้นบิต ผม− 1 (การนับบิตจากขวาไปซ้าย) ค่อนข้างพูด สถานะ XOR สุดท้าย ^ 0xedb88320 เกิดขึ้นเฉพาะเมื่อบิต b เท่ากับหนึ่ง นี่ถือได้ว่าเป็นการคูณ b ด้วย 0xedb88320 ก่อน แล้วจึง XOR เข้าสู่สถานะนั้น

นอกจากนี้ crc32_update_1 เป็นเพียง crc32_update_0 บวกค่าคงที่ (XOR) สิ่งนี้ทำให้ crc32_update_1 เป็นการแปลงความสัมพันธ์: การคูณเมทริกซ์ตามด้วยการแมป (เช่นการเพิ่มเวกเตอร์) เราสามารถแสดงการคูณเมทริกซ์และการแมปได้ในขั้นตอนเดียว หากเราเพิ่มขนาดของเมทริกซ์การแปลงเป็น 33x33 และเพิ่มองค์ประกอบพิเศษให้กับเวกเตอร์สถานะ ซึ่งจะเป็น 1 เสมอ (การแสดงดังกล่าวเรียกว่าพิกัดที่เป็นเนื้อเดียวกัน)


33×33 เมทริกซ์การแปลง M 0 และ M 1 ซึ่งคำนวณการเปลี่ยนแปลงสถานะ CRC-32 ที่ดำเนินการโดยบิต 0 และ 1 ตามลำดับ เวกเตอร์คอลัมน์จะถูกเก็บไว้โดยมีค่าบิตที่สำคัญที่สุดที่ด้านล่าง: เมื่ออ่านคอลัมน์แรกจากล่างขึ้นบน คุณจะเห็นค่าคงที่พหุนาม CRC-32 edb8832016 = 111 011 011 0111 0001 0000011 001 00000 2 . เมทริกซ์ทั้งสองต่างกันในคอลัมน์สุดท้ายเท่านั้น ซึ่งแสดงถึงเวกเตอร์การแปลในพิกัดที่เป็นเนื้อเดียวกัน ใน M 0 การแปลจะเป็นศูนย์ และใน M ​​1 คือ edb88320 16 ซึ่งเป็นค่าคงที่พหุนาม CRC-32 ส่วนที่อยู่เหนือเส้นทแยงมุมแสดงถึงสถานะของสถานะการทำงาน >> 1

ทั้งการดำเนินการ crc32_update_0 และ crc32_update_1 สามารถแสดงด้วยเมทริกซ์การเปลี่ยนแปลง 33x33 แสดงเมทริกซ์ M 0 และ M 1 ข้อดีของการแสดงเมทริกซ์คือสามารถคูณเมทริกซ์ได้ สมมติว่าเราต้องการเห็นการเปลี่ยนแปลงสถานะที่ทำโดยการประมวลผลอักขระ ASCII "a" ซึ่งการแทนค่าไบนารีคือ 01100001 2 เราสามารถแสดงการเปลี่ยนแปลงสถานะ CRC-32 สะสมของแปดบิตเหล่านี้ในเมทริกซ์การแปลงเดียว:


และเราสามารถแสดงการเปลี่ยนสถานะของสตริงของ "a" ที่ซ้ำกัน โดยการคูณสำเนา M a หลายชุด - เพิ่มเมทริกซ์เป็นยกกำลัง เราสามารถทำได้อย่างรวดเร็วโดยใช้อัลกอริธึมการยกกำลังที่รวดเร็ว ซึ่งคำนวณ M n ในเวลาเพียงบันทึก 2 n ขั้นตอน ตัวอย่างเช่น นี่คือเมทริกซ์การเปลี่ยนแปลงสถานะของแถวที่มีอักขระ 9 ตัว "a":
อัลกอริธึมการคูณเมทริกซ์แบบเร็วมีประโยชน์สำหรับการคำนวณ M kernel ซึ่งเป็นเมทริกซ์สำหรับเคอร์เนลที่ไม่บีบอัด เนื่องจากเคอร์เนลเป็นสตริงของไบต์ซ้ำ ในการรับเช็คซัม CRC-32 จากเมทริกซ์ ให้คูณเมทริกซ์ด้วยเวกเตอร์ null (เวกเตอร์ว่างอยู่ในพิกัดที่เป็นเนื้อเดียวกัน นั่นคือศูนย์ 32 ตัวตามด้วยหนึ่งตัว ในที่นี้เราละเว้นความซับซ้อนเล็กน้อยของการตรวจสอบก่อนและหลังการประมวลผล เพื่อความสม่ำเสมอ) ในการคำนวณผลรวมการตรวจสอบสำหรับแต่ละไฟล์ เราดำเนินการย้อนกลับ เริ่มต้นด้วยการเริ่มต้น M:= M เคอร์เนล. การตรวจสอบเคอร์เนลยังเป็นไฟล์สุดท้าย checksum นู๋ดังนั้นเราจึงคูณ เอ็มไปยังเวกเตอร์ศูนย์และเก็บผลรวมการตรวจสอบผลลัพธ์ใน CDH N และ LFH N ข้อมูลไฟล์ N-1เช่นเดียวกับไฟล์ data นู๋แต่มีการเพิ่มคำนำหน้า LFH N ดังนั้นเราจึงคำนวณ เมทริกซ์การเปลี่ยนสถานะสำหรับ LFH N และอัพเดต ตอนนี้ เอ็มแสดงถึงการเปลี่ยนแปลงสถานะสะสมจากการประมวลผล LFH N หลังเคอร์เนล คำนวณเช็คซัมสำหรับไฟล์ N-1, คูณอีกครั้ง เอ็มเป็นเวกเตอร์ว่าง เราดำเนินการตามขั้นตอนโดยสะสมเมทริกซ์การเปลี่ยนแปลงสถานะใน เอ็มจนกว่าไฟล์ทั้งหมดจะได้รับการประมวลผล

นามสกุล: Zip64

ก่อนหน้านี้เราพบปัญหาการขยายเนื่องจากข้อจำกัดของรูปแบบ zip - เป็นไปไม่ได้ที่จะให้มากกว่า 281TB ไม่ว่าไฟล์ zip จะถูกบรรจุอย่างชาญฉลาดเพียงใด เป็นไปได้ที่จะเอาชนะข้อ จำกัด เหล่านี้โดยใช้ Zip64 ซึ่งเป็นส่วนขยายของรูปแบบ zip ที่เพิ่มขนาดของฟิลด์ส่วนหัวบางฟิลด์เป็น 64 บิต การสนับสนุน Zip64 ไม่ได้เป็นสากล แต่เป็นหนึ่งในส่วนขยายที่มีการใช้งานบ่อยที่สุด ในแง่ของอัตราส่วนการบีบอัด ผลของ Zip64 คือการเพิ่มขนาดของส่วนหัวไดเรกทอรีกลางจาก 46 เป็น 58 ไบต์ และขนาดของส่วนหัวไดเรกทอรีภายในเครื่องจาก 30 เป็น 50 ไบต์ เมื่อพิจารณาจากสูตรสำหรับปัจจัยการขยายที่เหมาะสมที่สุดในแบบจำลองอย่างง่าย เราจะเห็นได้ว่า Zip64 zip bomb ยังคงเติบโตเป็นกำลังสอง แต่ช้าลงเนื่องจากตัวหารที่ใหญ่กว่า - สามารถดูได้ในแผนภาพด้านล่าง เนื่องจากสูญเสียความเข้ากันได้และการเติบโตที่ช้ากว่า ข้อจำกัดเกือบทั้งหมดเกี่ยวกับขนาดไฟล์จะถูกลบออกจากเรา

สมมติว่าเราต้องการ zip bomb ที่ขยายได้ถึง 4.5PB เช่น 42.zip ไฟล์เก็บถาวรควรใหญ่แค่ไหน? ด้วยการค้นหาแบบไบนารี เราพบว่าขนาดขั้นต่ำของไฟล์ดังกล่าวคือ 46 MB

  • zbxl.zip 46 MB → 4.5 PB (Zip64 เข้ากันได้น้อยกว่า)
zipbomb --mode=quoted_overlap --num-files=190023 --compressed-size=22982788 --zip64 > zbxl.zip
4.5 เพตาไบต์ - ข้อมูลประมาณเท่าที่กล้องโทรทรรศน์ขอบฟ้าเหตุการณ์บันทึกสำหรับภาพแรกของหลุมดำ: ชั้นวางและชั้นวางพร้อมฮาร์ดไดรฟ์ในศูนย์ข้อมูล

เมื่อใช้ Zip64 การพิจารณาอัตราส่วนการบีบอัดสูงสุดไม่ใช่เรื่องน่าสนใจอีกต่อไป เนื่องจากเราสามารถเพิ่มขนาดไฟล์ zip และอัตราส่วนการบีบอัดไปพร้อมกันได้ จนกว่าไฟล์ zip ที่บีบอัดจะมีขนาดใหญ่มาก อย่างไรก็ตาม เกณฑ์ที่น่าสนใจคือ 264 ไบต์ (18 EB หรือ 16 EiB) ซึ่งข้อมูลจำนวนมากจะไม่พอดีกับระบบไฟล์ส่วนใหญ่ การค้นหาแบบไบนารีจะค้นหา zip bomb ที่เล็กที่สุดที่สร้างเอาต์พุตได้มากเป็นอย่างน้อย: ประกอบด้วยไฟล์ 12 ล้านไฟล์และเคอร์เนลที่บีบอัด 1.5 GB ขนาดรวมของไฟล์ zip คือ 2.9 GB และแตกไฟล์เป็น 264+11727895877 ไบต์ โดยมีอัตราการบีบอัดมากกว่า 6.2 พันล้านต่อหนึ่งไฟล์ ฉันไม่ได้โพสต์ไฟล์นี้เพื่อดาวน์โหลด แต่คุณสามารถสร้างได้เองโดยใช้ . มันมีไฟล์ขนาดที่แม้แต่บั๊กใน Info-ZIP UnZip 6.0 ก็ถูกเปิดเผย

Zipbomb --mode=quoted_overlap --num-files=12056313 --compressed-size=1482284040 --zip64 > zbxxl.zip

นามสกุล: bzip2

DEFLATE เป็นอัลกอริธึมการบีบอัดที่ใช้บ่อยที่สุดสำหรับรูปแบบ zip แต่นี่เป็นเพียงหนึ่งในตัวเลือกมากมาย อาจเป็นอัลกอริธึมที่พบบ่อยที่สุดอันดับสองคือ bzip2 แม้ว่าจะเข้ากันไม่ได้เท่า DEFLATE ในทางทฤษฎี bzip2 มีอัตราส่วนการบีบอัดสูงสุดประมาณ 1.4 ล้านต่อหนึ่ง ซึ่งช่วยให้เคอร์เนลถูกบีบอัดให้แน่นยิ่งขึ้น

ในขั้นแรก Bzip2 จะเข้ารหัสการเข้ารหัสตามความยาวของรัน โดยลดความยาวของสตริงของไบต์ที่ซ้ำกันลง 51 เท่า ข้อมูลจะถูกแบ่งออกเป็นบล็อกขนาด 900 KB และแต่ละบล็อกจะถูกบีบอัดแยกกัน ในทางทฤษฎี หนึ่งบล็อกสามารถบีบอัดได้ถึง 32 ไบต์ 900,000 × 51 / 32 = 1,434,375

นอกเหนือจากการสูญเสียความเข้ากันได้ bzip2 อนุญาตให้วางระเบิดที่มีประสิทธิภาพมากขึ้นหรือไม่

ใช่ - แต่สำหรับไฟล์ขนาดเล็กเท่านั้น ปัญหาคือ bzip2 ไม่มีอะไรที่เหมือนกับบล็อก DEFLATE ที่ไม่มีการบีบอัดซึ่งเราใช้อ้างอิงส่วนหัวของไฟล์ในเครื่อง ดังนั้นจึงเป็นไปไม่ได้ที่จะทับซ้อนไฟล์และนำคอร์กลับมาใช้ใหม่ - แต่ละไฟล์ต้องเขียนสำเนาของตัวเอง ดังนั้นอัตราส่วนการบีบอัดโดยรวมจะไม่ดีไปกว่าอัตราส่วนสำหรับไฟล์แต่ละไฟล์ ในกราฟด้านล่าง เราจะเห็นว่า bzip2 ทำงานได้ดีกว่า DEFLATE โดยไม่มีการทับซ้อนกันสำหรับไฟล์ที่มีขนาดประมาณ 1 เมกะไบต์เท่านั้น

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

เปรียบเทียบอัตราการบีบอัดของ zip bomb แบบต่างๆ สังเกตแกนลอการิทึม โครงสร้างแต่ละรายการจะแสดงทั้งแบบมีและไม่มี Zip64 โครงสร้างที่ไม่ทับซ้อนกันมีอัตราการเติบโตเชิงเส้น ซึ่งเห็นได้จากอัตราส่วนคงที่ของแกน ออฟเซ็ตแนวตั้งของกราฟ bzip2 หมายความว่าอัตราส่วนการบีบอัดของ bzip2 นั้นมากกว่า DEFLATE ประมาณพันเท่า โครงสร้าง DEFLATE ที่ยกมามีอัตราการเติบโตแบบกำลังสอง ดังที่เห็นได้จากความเบ้ 2:1 ตัวแปร Zip64 มีประสิทธิภาพน้อยกว่าเล็กน้อย แต่อนุญาตให้มีความจุมากกว่า 281TB กราฟสำหรับ bzip2 ที่มีการอ้างอิงผ่านฟิลด์เพิ่มเติมจะเปลี่ยนจากกำลังสองเป็นเชิงเส้น เมื่อถึงขนาดไฟล์สูงสุด (2 32 −2 ไบต์) หรือจำนวนไฟล์สูงสุดที่อนุญาต

ส่วนขยาย: การอ้างอิงผ่านช่องเพิ่มเติม

จนถึงตอนนี้ เราใช้ฟังก์ชัน DEFLATE เพื่ออ้างอิงส่วนหัวของไฟล์ในเครื่อง และเราเพิ่งเห็นว่าเคล็ดลับนี้ใช้ไม่ได้ใน bzip2 อย่างไรก็ตาม มีวิธีอื่นในการอ้างอิง ซึ่งค่อนข้างจำกัด ซึ่งใช้เฉพาะฟังก์ชันของรูปแบบ zip และไม่ขึ้นอยู่กับอัลกอริธึมการบีบอัด

ที่ส่วนท้ายของโครงสร้างส่วนหัวของไฟล์ในเครื่องมี ช่องเพิ่มเติมความยาวผันแปรเพื่อเก็บข้อมูลที่ไม่พอดีกับฟิลด์ส่วนหัวปกติ (APPNOTE.TXT ส่วน 4.3.7) ข้อมูลเพิ่มเติมอาจรวมถึง ตัวอย่างเช่น การประทับเวลาหรือ Unix uid/gid ข้อมูล Zip64 จะถูกเก็บไว้ในฟิลด์เพิ่มเติม ฟิลด์พิเศษจะแสดงเป็นโครงสร้างค่าความยาว หากคุณเพิ่มความยาวโดยไม่เพิ่มค่า ช่องพิเศษจะรวมสิ่งที่อยู่ด้านหลังไว้ในไฟล์ zip ซึ่งก็คือส่วนหัวของไฟล์ในเครื่องถัดไป เมื่อใช้วิธีนี้ ส่วนหัวของไฟล์ในเครื่องแต่ละไฟล์สามารถ "อ้าง" ส่วนหัวต่อไปนี้ได้โดยการใส่ไว้ในฟิลด์ตัวเลือกของตนเอง เมื่อเทียบกับ DEFLATE มีข้อดีสามประการที่นี่:

  1. การอ้างอิงผ่านฟิลด์พิเศษต้องการเพียง 4 ไบต์แทนที่จะเป็น 5 ทำให้มีพื้นที่ว่างมากขึ้นสำหรับเคอร์เนล
  2. มันไม่ได้เพิ่มขนาดของไฟล์ ซึ่งหมายถึงเคอร์เนลที่ใหญ่กว่า เนื่องจากข้อจำกัดของรูปแบบ zip
  3. มันให้การอ้างอิง bzip2
แม้จะมีข้อดีเหล่านี้ การอ้างอิงผ่านฟิลด์เพิ่มเติมก็มีความยืดหยุ่นน้อยกว่า นี่ไม่ใช่ลูกโซ่ เช่นเดียวกับใน DEFLATE: ส่วนหัวของไฟล์ในเครื่องแต่ละไฟล์ต้องไม่เพียงแต่มีส่วนหัวที่ตามมาทันทีเท่านั้น แต่ยังมี ทั้งหมดหัวข้อต่อมา ฟิลด์เพิ่มเติมจะเพิ่มขึ้นเมื่อคุณเข้าใกล้จุดเริ่มต้นของไฟล์ zip เนื่องจากความยาวสูงสุดของฟิลด์ 2 คือ 16 -1 ไบต์ คุณจึงสามารถอ้างชื่อได้เฉพาะส่วนหัวของไฟล์ในเครื่อง 1808 (หรือ 1170 ใน Zip64) โดยสมมติชื่อ (ในกรณีของ DEFLATE คุณสามารถใช้ฟิลด์พิเศษเพื่ออ้างอิงชื่อแรก (สั้นที่สุด) ส่วนหัวของไฟล์ในเครื่องแล้วเปลี่ยนไปใช้การอ้างอิง DEFLATE สำหรับส่วนที่เหลือ) ปัญหาอีกประการหนึ่งคือเพื่อให้ตรงกับโครงสร้างข้อมูลภายในของฟิลด์เพิ่มเติม ต้องเลือกแท็ก 16 บิตสำหรับประเภท (APPNOTE.TXT, ส่วน 4.5.2) ก่อนข้อมูลการอ้างอิง เราต้องการเลือกประเภทแท็กที่จะทำให้ parsers ละเว้นข้อมูลที่ยกมาแทนที่จะพยายามตีความว่าเป็น metadata ที่มีความหมาย โปรแกรมแยกวิเคราะห์ Zip ต้องละเว้นแท็กประเภทที่ไม่รู้จัก เราจึงสามารถเลือกแท็กแบบสุ่มได้ แต่มีความเสี่ยงที่แท็กบางรายการจะใช้งานร่วมกันได้กับการออกแบบในอนาคต

แผนภาพก่อนหน้านี้แสดงให้เห็นถึงความเป็นไปได้ของการใช้ฟิลด์เพิ่มเติมใน bzip2 โดยมีและไม่มี Zip64 กราฟทั้งสองมีจุดพักซึ่งการเติบโตเปลี่ยนจากกำลังสองเป็นเส้นตรง หากไม่มี Zip64 สิ่งนี้จะเกิดขึ้นเมื่อถึงขนาดไฟล์ที่ไม่บีบอัดสูงสุด (2 32 −2 ไบต์) สามารถเพิ่มได้เฉพาะจำนวนไฟล์เท่านั้น ไม่สามารถเพิ่มขนาดได้ กราฟจะสิ้นสุดลงอย่างสมบูรณ์เมื่อจำนวนไฟล์ถึง 1809 เมื่อถึงจุดนี้ พื้นที่ว่างในฟิลด์เพิ่มเติมสำหรับการอ้างอิงชื่อเพิ่มเติมจะหมดลง ด้วย Zip64 ตัวแบ่งจะเกิดขึ้นที่ 1171 ไฟล์ หลังจากนั้นจะเพิ่มได้เฉพาะขนาดของไฟล์เท่านั้น ไม่ใช่จำนวนไฟล์ ฟิลด์พิเศษช่วยด้วย DEFLATE เช่นกัน แต่ความแตกต่างนั้นเล็กมากจนมองไม่เห็นด้วยตาเปล่า เพิ่มอัตราการบีบอัดของ zbsm.zip ขึ้น 1.2%; zblg.zip โดย 0.019%; และ zbxl.zip โดย 0.0025%

การอภิปราย

ในงานของพวกเขาในหัวข้อนี้ Pletz และเพื่อนร่วมงานใช้ไฟล์ที่ทับซ้อนกันเพื่อสร้างไฟล์ zip ที่เกือบจะจำลองตัวเองได้ Ginvael Coldwind แนะนำให้ใช้ไฟล์ที่ทับซ้อนกันก่อนหน้านี้ (สไลด์ 47)

เราออกแบบ zip bomb ที่ทับซ้อนกันในใบเสนอราคาโดยคำนึงถึงความเข้ากันได้ มีข้อแตกต่างในการใช้งานหลายประการ ซึ่งบางส่วนได้แสดงไว้ในตารางด้านล่าง โครงสร้างที่ได้นั้นเข้ากันได้กับตัวแยกวิเคราะห์ zip ซึ่งทำงานตามปกติ กล่าวคือ โดยการตรวจสอบไดเร็กทอรีส่วนกลางก่อนและใช้เป็นดัชนีของไฟล์ ในหมู่พวกเขาคือโปรแกรมแยกไฟล์ zip ที่ไม่ซ้ำใครจาก Nail ซึ่งสร้างขึ้นโดยอัตโนมัติจากไวยากรณ์ที่เป็นทางการ อย่างไรก็ตาม การออกแบบเข้ากันไม่ได้กับตัวแยกวิเคราะห์ "สตรีม" ซึ่งแยกวิเคราะห์ไฟล์ zip แบบ end-to-end ในรอบเดียวโดยไม่ต้องอ่านไดเร็กทอรีส่วนกลางก่อน โดยธรรมชาติแล้ว ตัวแยกวิเคราะห์สตรีมไม่อนุญาตให้ไฟล์ทับซ้อนกันทุกรูปแบบ เป็นไปได้มากว่าพวกเขาจะแยกไฟล์แรกเท่านั้น นอกจากนี้ พวกเขายังอาจโยนข้อผิดพลาด อย่างเช่นในกรณีของ

บทความกล่าวถึงไฟล์ zip 9 เลเยอร์ ไม่ใช่แค่เลขศูนย์จำนวนมาก ทำไม 9 ทำไม 10 ไฟล์ในแต่ละ?

อย่างแรก บทความ Wikipedia ระบุว่า 5 เลเยอร์จาก 16 ไฟล์ ไม่แน่ใจว่ามีความไม่สอดคล้องกันเกิดขึ้นที่ใด แต่นั่นไม่ใช่ทั้งหมดที่เกี่ยวข้อง คำถามที่แท้จริงคือเหตุใดจึงใช้การทำรังตั้งแต่แรก

DEFLATE ซึ่งเป็นวิธีการบีบอัดเพียงวิธีเดียวที่รองรับสำหรับไฟล์ zip* มีอัตราส่วนการบีบอัดสูงสุดที่ 1032 ซึ่งสามารถทำได้โดยไม่แสดงอาการสำหรับลำดับการทำซ้ำใดๆ ที่มีขนาด 1-3 ไบต์ ไม่ว่าคุณจะทำอะไรกับไฟล์ zip ตราบใดที่ใช้กับ DEFLATE เท่านั้น ขนาดของไฟล์ที่แตกแล้วจะไม่เกิน 1,032 เท่าของขนาดไฟล์ zip ดั้งเดิม

ดังนั้นต้องใช้ไฟล์ zip ที่ซ้อนกันเพื่อให้ได้อัตราส่วนการบีบอัดที่เกินจริง หากคุณมี 2 ชั้นการบีบอัด อัตราส่วนสูงสุดคือ 1032^2 = 1065024 สำหรับ 3 คือ 1099104768 เป็นต้น สำหรับ 5 ชั้นที่ใช้ใน 42.zip อัตราการบีบอัดสูงสุดตามทฤษฎีคือ 1170572956434432 อย่างที่คุณเห็น ขนาดจริงของ 42.zip อยู่ไกลจากระดับนี้ ส่วนหนึ่งคือค่าใช้จ่ายของรูปแบบ zip และส่วนหนึ่งก็คือพวกเขาไม่สนใจ

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

บันทึก. รูปแบบการบีบอัดอื่นๆ เช่น bzip2 มีอัตราส่วนการบีบอัดสูงสุดที่สูงกว่ามาก อย่างไรก็ตาม โปรแกรมแยกวิเคราะห์ zip ส่วนใหญ่ไม่ยอมรับ

ป.ล. เป็นไปได้ที่จะสร้างไฟล์ zip ที่จะคลายสำเนาของตัวเอง (ควิน) คุณยังสามารถสร้างสำเนาที่แตกหลายชุดได้ ดังนั้น หากคุณขยายขนาดไฟล์ซ้ำๆ ตลอดไป ขนาดสูงสุดที่เป็นไปได้คืออนันต์ ข้อ จำกัด เพียงอย่างเดียวคือสามารถเพิ่มได้เพียง 1,032 ครั้งในการทำซ้ำแต่ละครั้ง

ป.ล. ค่า 1032 ถือว่าข้อมูลไฟล์ในไฟล์ zip ไม่ทับซ้อนกัน คุณลักษณะหนึ่งของรูปแบบไฟล์ zip คือมีไดเร็กทอรีกลางที่แสดงไฟล์ในไฟล์เก็บถาวรและออฟเซ็ตข้อมูลไฟล์ หากคุณสร้างหลายรายการในไฟล์ที่ชี้ไปยังข้อมูลเดียวกัน คุณสามารถบรรลุอัตราส่วนการบีบอัดที่สูงขึ้นได้มาก แม้จะไม่มีการซ้อนอยู่ก็ตาม แต่ไฟล์ zip ดังกล่าวมักถูกโปรแกรมแยกวิเคราะห์ปฏิเสธ

บอกเพื่อน