Zip bombası nasıl yapılır?


131

Zip bombaları hakkındaki bu soru doğal olarak beni konuyla ilgili Wikipedia sayfasına yönlendirdi . Makale, sıkıştırmayı 1,3 eksabayta açan 45,1 kb'lik bir zip dosyası örneğinden bahsediyor.

İlk etapta böyle bir dosya oluşturmak için kullanılacak ilkeler / teknikler nelerdir? Bunu gerçekten yapmak istemiyorum, daha çok ilgili kavramların basitleştirilmiş bir "işler nasıl çalışır" açıklamasıyla ilgileniyorum.

ps

Makale 9 kat zip dosyasından bahsediyor, bu yüzden bir grup sıfırın sıkıştırılması basit bir durum değil. Neden 9, neden her birinde 10 dosya?


5
@Michael şikayetiniz geçerli değil. OP sadece nasıl çalıştığını sormakla kalmadı, yayınlanan makaledeki hiçbir şey bunun anti-virüsün devre dışı bırakılması amacını taşıdığını söylemiyor. Tam tersine, makalenin hamlesi, anti-virüsün devre dışı bırakılmasından yalnızca geçici bir söz edilen DOS tarzı bir saldırı gibi görünüyor.
San Jacinto

2
Önemli olan, OP'nin büyük bir sıkıştırılmış dosyadan değil, iç içe geçmiş arşivlerden oluşan belirli bir dosyaya atıfta bulunmasıdır.
Michael Borgwardt

1
Bence Michael haklı, "PS" de anlatılan dosyanın nasıl yaratılacağını açıklıyor ve diğer herkes yapmıyor. Ancak, "PS" bir düzenleme olarak eklendi, bu nedenle bu yanıtlar verildiği sırada bariz bir şekilde yanlış olmayabilir. "Böyle bir dosya" nın "1.3 eksabayta kadar açılan herhangi bir dosya" anlamına geldiğini düşündüler, "bağlantı kurduğum makalede açıklanan gibi yapılandırılmış bir dosya" anlamına geldiği ortaya çıktı.
Steve Jessop

1
@onebyone tamamen katılıyorum. Böyle bir durumda olumsuz oylamanın uygun olduğunu düşünmüyorum.
San Jacinto

4
Sanırım bir olumsuz oyu "bu sorunun en iyi yanıtı değil" veya "bir aptalsınız ve yaşamaya layık değilsiniz" veya ikisinin arasında nerede olduğu anlamında değerlendirip değerlendirmediğinize bağlı. Şahsen, cevabımı tekrar okumam ve onda düzeltmem gereken bariz bir şekilde yanlış bir şey olup olmadığına bakmam gerektiği anlamına gelen bir olumsuz oy kullanıyorum. Ama sonra, cevabımın bir şeye katkıda bulunduğunu düşünürsem, şu anda hemfikir olmamak ve cevabımı değiştirmemek beni oldukça mutlu ediyor. Ve yine de tüm oylama süreci hakkında oldukça endişeli hale geldim, şimdi Jon Skeet'i asla yakalayamayacağım anlaşıldı ;-)
Steve Jessop

Yanıtlar:


92

Wikipedia sayfasından alıntı:

Zip bombasına bir örnek, 45.1 kilobayt sıkıştırılmış veri olan 45.1.zip dosyasıdır, 10'lu setler halinde dokuz iç içe zip dosyası katmanı içerir, her alt katman arşivi toplam 1.30 eksabayt sıkıştırılmamış veri için 1.30 gigabayt dosya içerir. .

Yani tek ihtiyacınız olan, sıfırlarla dolu tek bir 1,3 GB dosyası, bunu bir ZIP dosyasına sıkıştırın, 10 kopya oluşturun, bunları bir ZIP dosyasına paketleyin ve bu işlemi 9 kez tekrarlayın.

Bu şekilde, tamamen açıldığında, bu miktarda başlamanızı gerektirmeden saçma miktarda veri üreten bir dosya elde edersiniz.

Ek olarak, iç içe geçmiş arşivler, virüs tarayıcıları gibi programların (bu "bombaların" ana hedefi) akıllı olmasını ve "çok büyük" arşivleri açmayı reddetmesini çok daha zor hale getirir, çünkü son seviyeye kadar toplam veri miktarı o kadar değil, o seviyeye ulaşana kadar en düşük seviyedeki dosyaların ne kadar büyük olduğunu "görmezsiniz" ve her bir dosya "çok büyük" değildir - sadece büyük sayı sorunludur.


2
Olmaz ... En alttaki sıfırları sıkıştırdıktan sonra, sonuçta ortaya çıkan sıkıştırılmış dosya bir sonraki katman için neredeyse sıkıştırılabilir olmayacaktır.
kirpi balığı

16
Ah, ama her seviyede on özdeş dosyanız var - bu da yine güzelce sıkıştırılıyor. ZIP, dosyalar arası artıklıktan yararlanmasa da, on adet ayrı ayrı sıkıştırılmış özdeş dosya içeren bir arşiv, bir sonraki katmanın yararlanabileceği çok sayıda fazlalığa sahip olabilir.
Michael Borgwardt

10
Önemli olan, mümkün olan en küçük dosyadan maksimum miktarda verinin nasıl üretileceği DEĞİLDİR - önemli olan, virüs tarayıcılarının çok büyük arşivlere karşı koruma girişimlerini engellemektir.
Michael Borgwardt

2
Wikipedia'daki makalenin amacı bu değil. DOS tarzı bir saldırıyı zorluyor gibi görünüyor.
San Jacinto

2
Ancak dosyalar yinelemeli olarak çıkarılmaz ... kurban, çalışmasını sağlamak için alt zip dosyalarını çıkarmaya devam etmelidir ... Bunun için herhangi bir çalışma.
Manoj

46

1.3 eksabaytlık sıfırlardan oluşan bir dosya oluşturun.

Sağ tıklayın> Sıkıştırılmış (sıkıştırılmış) klasöre gönder.


22
Alaycı "gülen suratı" unuttun.
tvanfosson

1
Dosya boyutu sınırları nedeniyle çoğu dosya sistemi ve sıkıştırma algoritmasında bu büyük olasılıkla imkansız olacaktır. Ancak, dosyaları sıkıştırılmış arşivde iç içe yerleştirmek (ve sıkıştırma algoritmasının toplam boyut sınırlaması varsa arşive daha fazla iç içe geçmiş arşiv koymak) bu sınırları atlamanıza olanak tanır.
Blixt

133
1'lerin 1.3 exabyte dosyasını yapmalıdır. 0'lardan çok daha zayıflar :)
Quinn Wilson

33
@quinn - bu yüzden (başlangıçta daha şişman) sıfırları sıkıştırmak çok daha etkili
wefwfwefwe

1
Bu size, yanılmıyorsam> 1 gb zip dosyası verir
Chris S

36

Bu, aşağıdaki komut kullanılarak Linux altında kolayca yapılır:

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

Sayıyı, sıkıştırmak istediğiniz KB sayısıyla değiştirin. Yukarıdaki örnek bir 10MiB zip bombası yaratır (pek bir bomba değildir, ancak süreci gösterir).

Tüm sıkıştırılmamış verileri depolamak için sabit disk alanına ihtiyacınız YOKTUR.


8
Ama gerek bu boyutunda O (n) hala sıkıştırılmamış veri sıkıştırmak için bilgisayar gücü sıkıştırılmamış veri.
tonfa

2
Evet, buradaki diğer tüm cevaplar gibi.
Thomi

6
Michael Borgwardt'ın cevabı, sıkıştırılmamış veri boyutunda O (log N).
Steve Jessop

1
Yaklaşık olarak, neyse. İşlemin her tekrarı "arşiv başlıklarını çıkarın, sıkıştırılmış dosya girişini 10 kez çoğaltın, arşiv başlıklarını değiştirin, sıkıştırın" zip iç içe geçme düzeyini 1 artırır, önceki adımdaki sıkıştırılmış verilerin boyutuyla orantılı olarak zaman alır , sıkıştırılmamış verilerin boyutunu 10 ile çarpar ve sıkıştırılmış verilerin boyutunu hiç büyütürse, kesinlikle bunu doğrusal bir faktör gibi bir şeyle yapmaz.
Steve Jessop

3
Yani sadece bir test olarak, -9 1.3 GB sıfırları sıkıştırıyorum. Sonuç 1,3 milyonluk bir dosyadır. Bunu 10 kez kopyaladım (zip başlıklarıyla uğraşmaktan rahatsız olmadım, bu yüzden sonuç bir zip bombası olarak çalışmayacak, ancak prensibi gösteriyor) zip -9 ila 34381 bayt ile sıkıştıran bir 13M dosyası verdim. Dolayısıyla, çoğaltma adımı dosyayı daha küçük hale getirir çünkü deflate yalnızca belirli bir maksimum boyuttaki simgeleri destekler. Sonraki adım 18453, ardından 19012, 19312, 19743, 20120, 20531, 20870 ile sonuçlanır.
Steve Jessop

10

Aşağıda Windows içindir:

Gönderen kavramının Güvenlik Odak kanıtı (! NSFW), bu (42 zip dosyası adıdır) şöyle devam ediyor 16 klasörlerle 16 klasörlerin her biri ile bir ZIP dosyası, var:

\ 42 \ lib 0 \ kitap 0 \ bölüm 0 \ doc 0 \ 0.dll
...
\ 42 \ lib F \ kitap F \ bölüm F \ doc F \ 0.dll

Muhtemelen bu rakamda yanılıyorum, ancak 4 ^ 16 (4,294,967,296) dizin oluşturuyor. Her dizin N baytlık tahsis alanına ihtiyaç duyduğundan, çok büyük olur. Sondaki dll dosyası 0 bayttır.

Sadece ilk dizini açtığınızda 4 gb \42\lib 0\book 0\chapter 0\doc 0\0.dllayırma alanı elde edilir.


27
Sadece güvenlik araştırması yapan çıplak bayanlar olduklarını varsaydım.
James McMahon

3
Zip dosyası nsfw idi. Büyük bir panik kırmızısı alarmı çalacak ve masanızın etrafındaki tavandan bir kafes düşecek
Chris S

4
Bir virüs dosyasına her isabet, İK ile bir röportajla sonuçlanırsa, o zaman virüs tarayıcıya ihtiyacınız yoktur veya İK departmanınıza ihtiyacınız yoktur. Bunlardan biri işe katkıda bulunmuyor ;-)
Steve Jessop

2
NSFW de olabilir, çünkü bir Ağ Virüs Tarayıcısı onu kontrol etmek ve bunu yapmak için çıkarmak isteyebilir.
Michael Stum

5
Virüs tarayıcısı onu şüpheli olarak işaretlemelidir (bu, güvenli bir şekilde engellenmesine veya virüsleri yüklemeye çalıştığınız için güvenli olmayan bir şekilde rapor edilmenize neden olabilir). Bomba gerçekten patlarsa, BT departmanınız değerli bir şey öğrenmiş demektir - daha iyi bir virüs tarayıcıya ihtiyaçları vardır.
Steve Jessop

8

Ciddi cevap:

(Temel olarak) Sıkıştırma, yinelenen kalıpları tespit etmeye dayanır, bu nedenle zip dosyası, aşağıdaki gibi bir şeyi temsil eden verileri içerir

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

Çok kısa zip dosyası, ancak genişlettiğinizde çok büyük.


1
Bu daha da sıkıştırılabilir, gerçekten: 0x1 (0x35) (yani, ikinci 0 35 kez tekrarlanır, böylece yorumunuza genişler)
Michael

5

Pratik bir ortamda bir tane oluşturmak için (yani, muazzam sabit sürücünüzde 1.3 eksabaytlık bir dosya oluşturmadan), muhtemelen dosya formatını ikili düzeyde öğrenmeniz ve istediğiniz dosyanın neye benzeyeceğini çeviren bir şey yazmanız gerekir. sıkıştırma.


5

Makale 9 kat zip dosyasından bahsediyor, bu yüzden bir grup sıfırın sıkıştırılması basit bir durum değil. Neden 9, neden her birinde 10 dosya?

İlk olarak, Wikipedia makalesi şu anda her biri 16 dosyadan oluşan 5 katman söylüyor. Tutarsızlığın nereden geldiğinden emin değilim, ancak hepsi o kadar alakalı değil. Asıl soru, ilk etapta neden yuva kullanmanın kullanılmasıdır.

Zip dosyaları * için yaygın olarak desteklenen tek sıkıştırma yöntemi olan DEFLATE, maksimum sıkıştırma oranı 1032'dir. Bu, 1-3 baytlık herhangi bir yinelenen dizi için asimptotik olarak elde edilebilir. Bir zip dosyasına ne yaparsanız yapın, sadece DEFLATE kullandığı sürece, paketlenmemiş boyut orijinal zip dosyasının boyutunun en fazla 1032 katı olacaktır.

Bu nedenle, gerçekten aşırı sıkıştırma oranları elde etmek için iç içe geçmiş zip dosyalarını kullanmak gerekir. 2 sıkıştırma katmanınız varsa, maksimum oran 1032 ^ 2 = 1065024 olur. 3 için, 1099104768, vb. Olur. 42.zip'de kullanılan 5 katman için teorik maksimum sıkıştırma oranı 1170572956434432'dir. Gördüğünüz gibi gerçek 42.zip bu seviyeden uzaktır. Bunun bir kısmı zip formatının ek yükü ve bir kısmı da umursamamış olmaları.

Tahmin etmem gerekirse, 42.zip'in sadece büyük bir boş dosya oluşturarak ve tekrar tekrar sıkıştırıp kopyalayarak oluşturulduğunu söyleyebilirim. Formatın sınırlarını zorlama veya sıkıştırmayı en üst düzeye çıkarma veya herhangi bir şey yapma girişimi yoktur - sadece rastgele olarak katman başına 16 kopya topladılar. Amaç, fazla çaba sarf etmeden büyük bir yük oluşturmaktı.

Not: bzip2 gibi diğer sıkıştırma formatları çok, çok, çok daha büyük maksimum sıkıştırma oranları sunar. Ancak çoğu zip ayrıştırıcısı bunları kabul etmez.

PS Kendisinin bir kopyasına (bir quine) açılacak bir zip dosyası oluşturmak mümkündür. Ayrıca kendi birden çok kopyasına açılan bir tane de yapabilirsiniz. Bu nedenle, bir dosyayı sonsuza kadar yinelemeli olarak açarsanız, olası maksimum boyut sonsuzdur. Tek sınırlama, her yinelemede en fazla 1032 artabilmesidir.

PPS 1032 şekli, zip dosyasındaki dosya verilerinin ayrık olduğunu varsayar. Zip dosya formatının bir tuhaflığı, arşivdeki dosyaları listeleyen ve dosya verilerine göre ofsetleri listeleyen merkezi bir dizine sahip olmasıdır. Aynı veriye işaret eden birden çok dosya girdisi oluşturursanız, yuvalama olmasa bile çok daha yüksek sıkıştırma oranları elde edebilirsiniz, ancak böyle bir zip dosyası büyük olasılıkla ayrıştırıcılar tarafından reddedilecektir.


4

Bir zipbomb (veya gzbomb) oluşturmanın güzel bir yolu, hedeflediğiniz ikili biçimi bilmektir. Aksi takdirde, bir akış dosyası kullansanız bile (örneğin kullanarak /dev/zero), akışı sıkıştırmak için gereken bilgi işlem gücüyle sınırlı kalırsınız.

Bir gzip bombasının güzel bir örneği: http://selenic.com/googolplex.gz57 (birkaç sıkıştırma düzeyinden sonra dosyaya gömülü ve büyük dosyalar oluşturan bir mesaj var)

Bu mesajı bulmakta iyi eğlenceler :)


2

Belki de, unix'te, belirli bir miktarda sıfırı doğrudan bir zip programına veya başka bir şeye aktarabilirsiniz? Unix hakkında bunu nasıl yapacağınızı açıklayacak kadar bilgim yok. Bunun dışında bir sıfır kaynağına ihtiyacınız olacak ve bunları stdin veya başka bir şeyden okuyan bir fermuarın içine sokacaksınız ...


Açıkça büyük bir sıfır akışının sıkıştırılmasının sonucu olmayan belirli bir dosyadan bahseden asıl soruyu dikkate almadığı için olumsuz oy verildi.
Michael Borgwardt

Hayır, yine de bilgi işlem gücüyle sınırlı olacaksınız. İdeal olarak, gzip / zip'i çalıştırmak istemezsiniz çünkü çok fazla CPU kullanacaktır (veya en azından O (n) n, açılmış dosyanın
boyutudur

@tonfa: Elbette bilgi işlem gücü ile sınırlı kalacaksınız. Benim gerekçem, diskinizde bir exabyte büyük dosya oluşturmak ve sonra onu sıkıştırmak istemeyeceğinizdi ...
Svish

2

Tüm dosya sıkıştırma algoritmaları, sıkıştırılacak bilginin entropisine dayanır . Teorik olarak 0 veya 1'lik bir akışı sıkıştırabilirsiniz ve yeterince uzunsa, çok iyi sıkıştırır.

Bu teori kısmı. Pratik kısım başkaları tarafından zaten belirtilmiştir.


2

Bz2, lzma (7-zip) ve rar gibi yeni (1995 sonrası) sıkıştırma algoritmaları, tekdüze dosyaların olağanüstü sıkıştırılmasını sağlar ve büyük boyutlu içeriği yönetilebilir bir boyuta sarmak için tek bir sıkıştırma katmanı yeterlidir.

Başka bir yaklaşım, aşırı boyutta seyrek bir dosya (eksabayt) oluşturmak ve ardından onu seyrek dosyaları anlayan sıradan bir şeyle sıkıştırmak olabilir (örn. Tar), şimdi denetleyen kişi dosyayı yayınlarsa, denetçinin var olan tüm sıfırları okuması gerekecektir. sadece dosyanın gerçek içeriği arasında dolamak için, eğer denetleyen kişi onu diske yazarsa, ancak çok az alan kullanılacaktır (iyi huylu bir arşivden çıkarıcı ve modern bir dosya sistemi varsayılarak).


2

Denedim. çıktı zip dosyası boyutu 84 KB boyutunda küçük bir dosyaydı.

Şimdiye kadar yaptığım adımlar:

  1. '0' dolu 1,4 GB .txt dosyası oluşturun
  2. sıkıştır.
  3. .zip dosyasını .txt olarak yeniden adlandırın ve ardından 16 kopya oluşturun
  4. hepsini bir .zip dosyasına sıkıştırın,
  5. .zip dosyası içindeki yeniden adlandırılmış .txt dosyalarını yeniden .zip olarak yeniden adlandırın
  6. 3 ile 5 arasındaki adımları sekiz kez tekrarlayın.
  7. Zevk almak :)

Yine de yeniden adlandırılan zip dosyasının sıkıştırılmasının onu daha küçük bir boyuta sıkıştırdığı kısmı nasıl açıklayacağımı bilmiyorum, ama işe yarıyor. Belki sadece teknik terimlerim eksiktir.


Bu arada, içindeki tüm zip dosyalarını sürekli olarak çıkaracağından korkmayın. Yalnızca altına yerleştirilmiş olan zip dosyasını çıkarır, en alta değil.
jaycroll

2

Silicon Valley 3. Sezon 7. Bölüm beni buraya getirdi. Zip bombası oluşturma adımları olacaktır.

  1. Sıfır (veya zayıf olduklarını düşünüyorsanız birler) boyutunda (1 GB diyelim) bir kukla dosya oluşturun.
  2. Bu dosyayı bir zip dosyasına sıkıştırın diyelim 1.zip.
  3. Make nbu dosyanın kopyasını (10 demek) ve bir sıkıştırılmış arşiv (diyelim bu 10 dosya eklemek 2.zip).
  4. 3. adımı kbirçok kez tekrarlayın .
  5. Zip bombası alacaksın.

Bir Python uygulaması için bunu kontrol edin .


1

ZIP'in Çalışma Uzunluğu Kodlamasını kullanıp kullanmadığını bilmiyorum, ancak kullansaydı, böyle sıkıştırılmış bir dosya küçük bir veri parçası ve çok büyük bir çalışma uzunluğu değeri içerecektir. Çalışma uzunluğu değeri, küçük veri parçasının kaç kez tekrarlandığını belirtir. Çok büyük bir değere sahip olduğunuzda, ortaya çıkan veriler orantılı olarak büyüktür.


2
ZIP, verileri etkin bir şekilde belirtmek için Lempel-Ziv-Welch (veya değiştirilmiş bir sürümü) sıkıştırmasını kullanır. Uzun bayt 'kümeleri' iyi sıkıştırmaya neden olur, bu nedenle GIF (LZW'yi de kullanır) grafikler için iyidir ve JPEG (karmaşık bir sinüs dalgası sıkıştırması kullanır) verilerin çok daha 'rastgele olduğu fotoğraflar için daha iyidir '.
Lazarus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.