Làm thế nào để người ta tạo ra một quả bom Zip?


131

Câu hỏi này về bom zip tự nhiên dẫn tôi đến trang Wikipedia về chủ đề này. Bài viết đề cập đến một ví dụ về tệp zip 45,1 kb giải nén thành 1,3 exabyte.

Các nguyên tắc / kỹ thuật sẽ được sử dụng để tạo ra một tập tin như vậy ở nơi đầu tiên là gì? Tôi không muốn thực sự làm điều này, quan tâm nhiều hơn đến một lời giải thích "cách thức hoạt động" đơn giản hóa các khái niệm liên quan.

ps

Bài viết đề cập đến 9 lớp tệp zip, vì vậy đây không phải là trường hợp đơn giản để nén một số không. Tại sao 9, tại sao 10 tệp trong mỗi?


5
@Michael khiếu nại của bạn không hợp lệ. OP không chỉ hỏi làm thế nào nó hoạt động, không có gì trong bài viết được đăng nói rằng nó là cho mục đích rõ ràng là vô hiệu hóa chống vi-rút. Hoàn toàn ngược lại, có vẻ như sự thúc đẩy của bài viết là một cuộc tấn công kiểu DOS chỉ với một đề cập đến về việc vô hiệu hóa chống vi-rút.
San Jacinto

2
Vấn đề là OP đã đề cập đến một tệp cụ thể, bao gồm các tài liệu lưu trữ lồng nhau, không phải là một tệp nén lớn.
Michael Borgwardt

1
Tôi nghĩ Michael nói đúng, anh ấy giải thích cách tạo tệp được mô tả trong "PS", và mọi người khác thì không. Tuy nhiên, "PS" đã được thêm vào dưới dạng chỉnh sửa, vì vậy những câu trả lời đó có thể không bị sai một cách trắng trợn tại thời điểm chúng được đưa ra. Họ chỉ nghĩ rằng "một tệp như vậy" có nghĩa là "bất kỳ tệp nào giải nén thành 1,3 exabyte", khi nó hóa ra có nghĩa là "một tệp có cấu trúc như tệp được mô tả trong bài viết tôi liên kết đến".
Steve Jessop

1
@onitherone Tôi hoàn toàn đồng ý. Tôi chỉ không nghĩ rằng một downvote là thích hợp trong trường hợp như vậy.
San Jacinto

4
Tôi đoán nó phụ thuộc vào việc bạn xem xét một downvote có nghĩa là "đây không phải là câu trả lời tốt nhất cho câu hỏi" hay "bạn là một kẻ ngốc và không xứng đáng để sống", hoặc nơi ở giữa. Cá nhân, tôi lấy một downvote có nghĩa là tôi nên đọc lại câu trả lời của mình và xem nếu có bất cứ điều gì rõ ràng sai với nó mà tôi nên sửa chữa. Nhưng sau đó, tôi khá hạnh phúc khi không đồng ý và không thay đổi câu trả lời của mình, nếu tôi nghĩ câu trả lời của mình đóng góp gì đó. Và tôi đã trở nên khá không quan tâm đến toàn bộ quá trình bỏ phiếu, dù sao thì rõ ràng tôi sẽ không bao giờ bắt Jon Skeet ;-)
Steve Jessop

Câu trả lời:


92

Trích dẫn từ trang Wikipedia:

Một ví dụ về bom Zip là tệp 45.1.zip là 45,1 kilobyte dữ liệu nén, chứa chín lớp tệp zip lồng nhau trong bộ 10, mỗi tệp lưu trữ lớp dưới cùng chứa tệp 1,30 gigabyte cho tổng số 1,30 exabyte dữ liệu không nén .

Vì vậy, tất cả những gì bạn cần là một tệp 1,3 GB duy nhất chứa đầy số 0, nén nó thành tệp ZIP, tạo 10 bản sao, đóng gói chúng thành tệp ZIP và lặp lại quy trình này 9 lần.

Bằng cách này, bạn nhận được một tệp mà khi không nén hoàn toàn sẽ tạo ra một lượng dữ liệu vô lý mà không yêu cầu bạn phải bắt đầu với số tiền đó.

Ngoài ra, các tài liệu lưu trữ lồng nhau làm cho các chương trình như máy quét vi-rút (mục tiêu chính của các "quả bom") này trở nên thông minh hơn và từ chối giải nén các tài liệu lưu trữ "quá lớn", bởi vì cho đến cấp cuối cùng, tổng lượng dữ liệu là không nhiều lắm, bạn không "thấy" các tệp ở mức thấp nhất lớn đến mức nào cho đến khi bạn đạt đến mức đó và mỗi tệp riêng lẻ không "quá lớn" - chỉ có số lượng lớn là có vấn đề.


2
Không thể ... một khi bạn nén tệp số không ở dưới cùng, tệp được nén sẽ không thể nén được cho lớp tiếp theo.
cá nóc

16
À, nhưng ở mỗi cấp độ, bạn có mười tệp giống hệt nhau - một lần nữa nén độc đáo. Mặc dù ZIP không khai thác dự phòng tệp chéo, một kho lưu trữ chứa mười tệp giống nhau được nén riêng lẻ có thể có rất nhiều dự phòng cho lớp tiếp theo để khai thác.
Michael Borgwardt

10
Vấn đề KHÔNG phải là làm thế nào để tạo ra lượng dữ liệu tối đa từ tệp nhỏ nhất có thể - vấn đề là đánh bại các nỗ lực của máy quét vi-rút để bảo vệ chống lại các kho lưu trữ quá lớn.
Michael Borgwardt

2
Đó không phải là lực đẩy của bài viết trên wikipedia. Nó dường như đẩy một cuộc tấn công kiểu DOS.
San Jacinto

2
Nhưng các tệp không được trích xuất đệ quy ... nạn nhân nên tiếp tục giải nén các tệp zip phụ để làm cho nó hoạt động ... Mọi công việc xung quanh nó.
Manoj

46

Tạo một tập tin 1,3 exabyte của số không.

Nhấp chuột phải> Gửi đến thư mục nén (nén).


22
Bạn đã quên lời mỉa mai "cười."
tvanfosson

1
Điều đó rất có thể là không thể đối với hầu hết các hệ thống tệp và thuật toán nén do giới hạn kích thước tệp. Tuy nhiên, các tệp lồng nhau trong kho lưu trữ nén (và đặt nhiều lưu trữ lồng nhau hơn vào kho lưu trữ, nếu thuật toán nén có giới hạn tổng kích thước) cho phép bạn bỏ qua các giới hạn này.
Blixt

133
nên tạo một tệp 1,3 exabyte của 1's. Họ gầy hơn nhiều so với 0 giây :)
Quinn Wilson

33
@quinn - đó là lý do tại sao việc nén các số 0 (ban đầu béo hơn) hiệu quả hơn nhiều
wefwfwefwe

1
Điều này cung cấp cho bạn tệp zip> 1gb trừ khi tôi nhầm
Chris S

36

Điều này được thực hiện dễ dàng trong Linux bằng lệnh sau:

dd if=/dev/zero bs=1024 count=10000 | zip zipbomb.zip -

Thay thế số lượng bằng số KB bạn muốn nén. Ví dụ trên tạo ra một quả bom zip 10MiB (hoàn toàn không phải là một quả bom, nhưng nó cho thấy quá trình này).

Bạn KHÔNG cần dung lượng đĩa cứng để lưu trữ tất cả dữ liệu không nén.


8
Nhưng bạn cần sức mạnh tính toán để nén dữ liệu không nén, vẫn là O (n) trong kích thước của dữ liệu không nén .
tonfa

2
Vâng, như tất cả các câu trả lời khác ở đây.
Thomi

6
Câu trả lời của Michael Borgwardt là O (log N) về kích thước của dữ liệu không nén.
Steve Jessop

1
Khoảng, dù sao đi nữa. Mỗi lần lặp lại của quy trình "loại bỏ các tiêu đề lưu trữ, nhân đôi mục nhập tệp nén 10 lần, thay thế các tiêu đề lưu trữ, nén" làm tăng mức độ lồng nhau của zip lên 1, mất thời gian tỷ lệ với kích thước của dữ liệu nén từ bước trước đó , nhân kích thước của dữ liệu không nén lên 10 lần và nếu nó tăng kích thước của dữ liệu nén, chắc chắn sẽ không làm như vậy bởi bất cứ điều gì như yếu tố tuyến tính.
Steve Jessop

3
Vì vậy, chỉ là một thử nghiệm, tôi nén -9 1,3 GB số không. Kết quả là một tệp 1.3M. Tôi đã nhân đôi 10 lần này (không thể làm phiền với các tiêu đề zip, vì vậy kết quả sẽ không hoạt động như một quả bom zip, nhưng minh họa nguyên tắc) để tạo ra một tệp 13M, nén với zip -9 đến 34381 byte. Vì vậy, bước sao chép thực sự làm cho tệp nhỏ hơn, vì deflate chỉ hỗ trợ mã thông báo có kích thước tối đa nhất định. Bước tiếp theo có kết quả vào năm 18453, sau đó là 19012, 19312, 19743, 20120, 20531, 20870.
Steve Jessop

10

Dưới đây là dành cho Windows:

Từ bằng chứng khái niệm Security Focus (NSFW!), Đó là tệp ZIP có 16 thư mục, mỗi thư mục có 16 thư mục, cứ tiếp tục như vậy (42 là tên tệp zip):

\ 42 \ lib 0 \ book 0 \ chương 0 \ doc 0 \ 0.dll
...
\ 42 \ lib F \ book F \ chương F \ doc F \ 0.dll

Tôi có thể sai với con số này, nhưng nó tạo ra 4 ^ 16 (4.294.967.296) thư mục. Bởi vì mỗi thư mục cần không gian phân bổ của N byte, nên cuối cùng nó sẽ rất lớn. Tệp dll ở cuối là 0 byte.

Giải nén thư mục đầu tiên một mình \42\lib 0\book 0\chapter 0\doc 0\0.dlldẫn đến 4gb không gian phân bổ.


27
Tôi chỉ cho rằng họ là những phụ nữ khỏa thân làm nghiên cứu bảo mật.
James McMahon

3
Các zip là nsfw. Một báo động lớn màu đỏ hoảng loạn sẽ tắt và một cái lồng sẽ rơi xuống từ trần nhà xung quanh bàn làm việc của bạn
Chris S

4
Nếu mỗi lần truy cập vào tệp vi-rút dẫn đến một cuộc phỏng vấn với HR, thì bạn không cần trình quét vi-rút, hoặc nếu không bạn không cần bộ phận nhân sự của mình. Một trong số họ không đóng góp cho doanh nghiệp ;-)
Steve Jessop

2
Cũng có thể là NSFW vì Network Virus Scanner có thể muốn kiểm tra nó - và giải nén nó để làm như vậy.
Michael Stum

5
Trình quét vi-rút chỉ nên đánh dấu nó đáng ngờ (điều này có thể khiến nó bị chặn an toàn hoặc có thể dẫn đến việc bạn không được báo cáo về việc cố gắng cài đặt vi-rút). Nếu quả bom thực sự phát nổ, thì bộ phận CNTT của bạn đã học được điều gì đó có giá trị - họ cần một trình quét virus tốt hơn.
Steve Jessop

8

Câu trả lời nghiêm túc:

(Rất cơ bản) Nén dựa vào các mẫu lặp lại, vì vậy tệp zip sẽ chứa dữ liệu đại diện cho một cái gì đó như

0x100000000000000000000000000000000000  
(Repeat this '0' ten trillion times)

Tệp zip rất ngắn, nhưng rất lớn khi bạn mở rộng nó.


1
Điều đó có thể được nén hơn nữa, thực sự: 0x1 (0x35) (nghĩa là 0 thứ hai được lặp lại 35 lần để nó mở rộng sang nhận xét của bạn)
Michael

5

Để tạo một tệp trong một cài đặt thực tế (nghĩa là không tạo tệp exabyte 1.3 trên ổ cứng cực lớn), bạn có thể phải học định dạng tệp ở cấp nhị phân và viết một cái gì đó dịch sang tệp mong muốn của bạn, sau đó nén.


5

Bài viết đề cập đến 9 lớp tệp zip, vì vậy đây không phải là trường hợp đơn giản để nén một số không. Tại sao 9, tại sao 10 tệp trong mỗi?

Trước hết, bài viết Wikipedia hiện nói 5 lớp với 16 tệp mỗi tệp. Không chắc chắn sự khác biệt đến từ đâu, nhưng nó không liên quan. Câu hỏi thực sự là tại sao sử dụng làm tổ ở nơi đầu tiên.

DEFLATE, phương pháp nén duy nhất thường được hỗ trợ cho các tệp zip *, có tỷ lệ nén tối đa là 1032. Điều này có thể đạt được một cách không có triệu chứng đối với bất kỳ chuỗi lặp lại 1-3 byte nào. Bất kể bạn làm gì với tệp zip, miễn là nó chỉ sử dụng DEFLATE, kích thước được giải nén sẽ nhiều nhất gấp 1032 lần kích thước của tệp zip gốc.

Do đó, cần phải sử dụng các tệp zip lồng nhau để đạt được tỷ lệ nén thực sự thái quá. Nếu bạn có 2 lớp nén, tỷ lệ tối đa trở thành 1032 ^ 2 = 1065024. Đối với 3, đó là 1099104768, v.v. Đối với 5 lớp được sử dụng trong 42.zip, tỷ lệ nén tối đa theo lý thuyết là 1170572956434432. Như bạn có thể thấy, 42.zip thực tế khác xa mức đó. Một phần trong đó là chi phí chung của định dạng zip và một phần là họ không quan tâm.

Nếu tôi phải đoán, tôi sẽ nói rằng 42.zip được hình thành chỉ bằng cách tạo một tệp trống lớn, và liên tục nén và sao chép nó. Không có nỗ lực để đẩy các giới hạn của định dạng hoặc tối đa hóa nén hoặc bất cứ điều gì - họ chỉ tự ý chọn 16 bản sao cho mỗi lớp. Vấn đề là tạo ra một trọng tải lớn mà không cần nỗ lực nhiều.

Lưu ý: Các định dạng nén khác, chẳng hạn như bzip2, cung cấp tỷ lệ nén tối đa lớn hơn nhiều. Tuy nhiên, hầu hết các trình phân tích cú pháp zip không chấp nhận chúng.

PS Có thể tạo một tệp zip sẽ giải nén thành một bản sao của chính nó (một quine). Bạn cũng có thể tạo một bản sao để mở ra nhiều bản sao của chính nó. Do đó, nếu bạn giải nén đệ quy một tệp mãi mãi, kích thước tối đa có thể là vô hạn. Hạn chế duy nhất là nó có thể tăng tối đa 1032 trên mỗi lần lặp.

PPS Hình 1032 giả định rằng dữ liệu tệp trong zip không khớp nhau. Một điều khó hiểu của định dạng tệp zip là nó có một thư mục trung tâm liệt kê các tệp trong kho lưu trữ và bù đắp cho dữ liệu tệp. Nếu bạn tạo nhiều mục nhập tệp trỏ đến cùng một dữ liệu, bạn có thể đạt được tỷ lệ nén cao hơn nhiều ngay cả khi không lồng nhau, nhưng tệp zip như vậy có khả năng bị từ chối bởi trình phân tích cú pháp.


4

Một cách hay để tạo zipbomb (hoặc gzbomb) là biết định dạng nhị phân bạn đang nhắm mục tiêu. Mặt khác, ngay cả khi bạn sử dụng tệp phát trực tuyến (ví dụ: sử dụng /dev/zero), bạn vẫn sẽ bị giới hạn bởi sức mạnh tính toán cần thiết để nén luồng.

Một ví dụ hay về bom gzip: http://selenic.com/googolplex.gz57 (có một thông báo được nhúng trong tệp sau một vài cấp độ nén dẫn đến các tệp lớn)

Hãy vui vẻ tìm tin nhắn đó :)


2

Có lẽ, trên unix, bạn có thể chuyển một số lượng không nhất định trực tiếp vào một chương trình zip hoặc một cái gì đó? Không biết đủ về unix để giải thích cách bạn sẽ làm điều đó mặc dù. Ngoài ra, bạn sẽ cần một nguồn số không, và đặt chúng vào một khóa kéo đọc từ stdin hoặc thứ gì đó ...


Bị bỏ qua vì đã bỏ qua câu hỏi thực tế, trong đó đề cập đến một tệp cụ thể rõ ràng không phải là kết quả của việc nén một luồng số không lớn.
Michael Borgwardt

Không, bạn vẫn sẽ bị giới hạn bởi sức mạnh tính toán. Lý tưởng nhất là bạn không muốn chạy gzip / zip vì nó sẽ sử dụng rất nhiều CPU (hoặc ít nhất là O (n) n là kích thước của tệp được giải nén)
tonfa

@tonfa: Chà, tất nhiên bạn sẽ bị giới hạn bởi sức mạnh tính toán. Lý do của tôi là bạn có thể không muốn tạo một tệp exabyte lớn trên đĩa của mình và sau đó nén nó ...
Svish

2

Tất cả các thuật toán nén tệp dựa trên entropy của thông tin sẽ được nén. Về mặt lý thuyết, bạn có thể nén một luồng 0 hoặc 1 và nếu đủ lâu, nó sẽ nén rất tốt.

Đó là phần lý thuyết. Phần thực tế đã được chỉ ra bởi những người khác.


2

Các thuật toán nén gần đây (bài 1995) như bz2, lzma (7-zip) và rar cho phép nén các tệp đơn điệu một cách ngoạn mục và một lớp nén duy nhất là đủ để bọc nội dung quá khổ đến kích thước có thể quản lý được.

Một cách tiếp cận khác có thể là tạo một tệp thưa thớt có kích thước cực lớn (exabyte) và sau đó nén nó bằng một thứ gì đó trần tục để hiểu các tệp thưa thớt (ví dụ: tar), bây giờ nếu người kiểm tra truyền tệp thì người kiểm tra sẽ cần phải đọc qua tất cả các số không tồn tại Chỉ để đệm giữa nội dung thực tế của tệp, nếu người kiểm tra ghi nó vào đĩa, tuy nhiên sẽ có rất ít không gian được sử dụng (giả sử một trình hủy lưu trữ được xử lý tốt và hệ thống tệp hiện đại).


2

Thử nó. kích thước tệp zip đầu ra là một tệp 84-KB nhỏ.

Các bước tôi đã thực hiện cho đến nay:

  1. tạo tệp .txt 1,4 GB đầy '0'
  2. nén nó
  3. đổi tên .zip thành .txt sau đó tạo 16 bản sao
  4. kết hợp tất cả vào một tệp .zip,
  5. đổi tên các tệp .txt đã đổi tên trong tệp .zip thành .zip một lần nữa
  6. lặp lại các bước 3 đến 5 tám lần.
  7. Thưởng thức :)

mặc dù tôi không biết làm thế nào để giải thích phần nén tệp zip được đổi tên vẫn nén nó thành một kích thước nhỏ hơn, nhưng nó hoạt động. Có lẽ tôi chỉ thiếu các thuật ngữ kỹ thuật.


Nhân tiện, đừng sợ rằng nó sẽ liên tục trích xuất tất cả các tệp zip bên trong nó. Nó chỉ trích xuất tệp zip được lồng bên dưới nó chứ không phải tất cả các đường dẫn xuống phía dưới.
jaycroll

2

Thung lũng Silicon mùa 3 tập 7 đã đưa tôi đến đây. Các bước để tạo ra một quả bom zip sẽ là.

  1. Tạo một tệp giả có số không (hoặc tệp nếu bạn nghĩ chúng gầy) có kích thước (giả sử là 1 GB).
  2. Nén tệp này vào tệp zip 1.zip.
  3. Tạo n(nói 10) bản sao của tệp này và thêm 10 tệp này vào kho lưu trữ nén (giả sử 2.zip).
  4. Lặp lại bước 3 ksố lần.
  5. Bạn sẽ nhận được một quả bom zip.

Để thực hiện Python, hãy kiểm tra điều này .


1

Tôi không biết nếu ZIP sử dụng Mã hóa độ dài chạy, nhưng nếu có, một tệp nén như vậy sẽ chứa một phần dữ liệu nhỏ và giá trị độ dài chạy rất lớn. Giá trị độ dài chạy sẽ chỉ định số lần dữ liệu nhỏ được lặp lại bao nhiêu lần. Khi bạn có một giá trị rất lớn, dữ liệu kết quả sẽ tương đối lớn.


2
ZIP sử dụng nén Lempel-Ziv-Welch (hoặc phiên bản sửa đổi) để mã hóa dữ liệu một cách hiệu quả. Việc chạy 'bộ' byte dài sẽ dẫn đến khả năng nén tốt, do đó, tại sao GIF (cũng sử dụng LZW) tốt cho đồ họa và JPEG (sử dụng nén sóng hình sin phức tạp) sẽ tốt hơn cho những bức ảnh có dữ liệu ngẫu nhiên hơn nhiều '.
Lazarus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.