Pertanyaan tentang bom ritsleting ini secara alami mengarahkan saya ke halaman Wikipedia tentang topik itu. Artikel tersebut menyebutkan contoh file zip 45,1 kb yang terekompresi menjadi 1,3 exabytes.
Apa prinsip / teknik yang akan digunakan untuk membuat file seperti itu di tempat pertama? Saya tidak ingin benar-benar melakukan ini, lebih tertarik pada penjelasan "cara kerja" yang disederhanakan dari konsep yang terlibat.
ps
Artikel ini menyebutkan 9 lapisan file zip, jadi ini bukan kasus sederhana untuk zip sekelompok nol. Mengapa 9, mengapa 10 file di masing-masing?
algorithm
compression
ikan buntal
sumber
sumber
Jawaban:
Mengutip dari halaman Wikipedia:
Jadi yang Anda butuhkan hanyalah satu file 1.3GB penuh angka nol, kompres itu menjadi file ZIP, buat 10 salinan, kemas dalam file ZIP, dan ulangi proses ini 9 kali.
Dengan cara ini, Anda mendapatkan file yang, ketika tidak terkompresi sepenuhnya, menghasilkan jumlah data yang absurd tanpa mengharuskan Anda untuk memulai dengan jumlah itu.
Selain itu, arsip yang bersarang membuat program seperti pemindai virus (target utama "bom") jauh lebih sulit untuk menjadi pintar dan menolak membongkar arsip yang "terlalu besar", karena hingga tingkat terakhir jumlah total data adalah tidak sebanyak itu, Anda tidak "melihat" seberapa besar file di level terendah sampai Anda telah mencapai level itu, dan setiap file individual tidak "terlalu besar" - hanya sejumlah besar yang bermasalah.
sumber
Buat file 1,3 exabyte nol.
Klik kanan> Kirim ke folder terkompresi (zip).
sumber
Ini mudah dilakukan di Linux menggunakan perintah berikut:
dd if=/dev/zero bs=1024 count=10000 | zip zipbomb.zip -
Ganti hitungan dengan jumlah KB yang ingin Anda kompres. Contoh di atas membuat bom pos 10MiB (tidak banyak bom sama sekali, tetapi menunjukkan prosesnya).
Anda TIDAK membutuhkan ruang hard disk untuk menyimpan semua data yang tidak terkompresi.
sumber
Di bawah ini untuk Windows:
Dari bukti konsep Keamanan Fokus (NSFW!), Ini adalah file ZIP dengan 16 folder, masing-masing dengan 16 folder, yang berjalan seperti itu (42 adalah nama file zip):
Saya mungkin salah dengan angka ini, tetapi menghasilkan 4 ^ 16 (4.294.967.296) direktori. Karena setiap direktori membutuhkan ruang alokasi N byte, itu akhirnya menjadi besar. File dll di akhir adalah 0 byte.
Buka ritsleting direktori pertama saja
\42\lib 0\book 0\chapter 0\doc 0\0.dll
menghasilkan ruang alokasi 4gb.sumber
Jawaban serius:
(Pada dasarnya) Kompresi bergantung pada melihat pola yang berulang, sehingga file zip akan berisi data yang mewakili sesuatu seperti
File zip sangat pendek, tetapi besar saat Anda mengembangkannya.
sumber
Untuk membuat satu dalam pengaturan praktis (yaitu tanpa membuat file 1,3 exabyte pada Anda harddisk besar), Anda mungkin harus mempelajari format file di tingkat biner dan menulis sesuatu yang menerjemahkan seperti apa file yang Anda inginkan akan terlihat seperti, pasca- kompresi.
sumber
Pertama, artikel Wikipedia saat ini mengatakan 5 lapisan dengan 16 file masing-masing. Tidak yakin dari mana perbedaan itu berasal, tetapi tidak semuanya relevan. Pertanyaan sebenarnya adalah mengapa menggunakan bersarang di tempat pertama.
DEFLATE, satu-satunya metode kompresi yang umum didukung untuk file zip *, memiliki rasio kompresi maksimum 1032. Ini dapat dicapai secara asimptot untuk setiap urutan berulang sebesar 1-3 byte. Apa pun yang Anda lakukan pada file zip, asalkan hanya menggunakan DEFLATE, ukuran yang dibongkar paling banyak 1032 kali dari ukuran file zip asli.
Oleh karena itu, perlu menggunakan file zip bersarang untuk mencapai rasio kompresi yang benar-benar keterlaluan. Jika Anda memiliki 2 lapisan kompresi, rasio maksimum menjadi 1032 ^ 2 = 1065024. Untuk 3, itu 1099104768, dan seterusnya. Untuk 5 lapisan yang digunakan pada 42.zip, rasio kompresi maksimum teoretis adalah 1170572956434432. Seperti yang Anda lihat, 42.zip yang sebenarnya jauh dari level itu. Sebagian dari itu adalah overhead format zip, dan sebagian lagi adalah mereka tidak peduli.
Jika saya harus menebak, saya akan mengatakan bahwa 42.zip dibentuk dengan hanya membuat file kosong yang besar, dan berulang kali zip dan menyalinnya. Tidak ada upaya untuk mendorong batas format atau memaksimalkan kompresi atau apa pun - mereka hanya secara sewenang-wenang mengambil 16 salinan per lapisan. Intinya adalah untuk menciptakan muatan besar tanpa banyak usaha.
Catatan: Format kompresi lainnya, seperti bzip2, menawarkan rasio kompresi maksimum yang jauh lebih banyak. Namun, sebagian besar parser zip tidak menerimanya.
PS Dimungkinkan untuk membuat file zip yang akan di-unzip ke salinannya sendiri (quine). Anda juga dapat membuat satu yang membuka ritsleting ke beberapa salinan itu sendiri. Oleh karena itu, jika Anda secara unzip mengekstrak file selamanya, ukuran maksimum yang mungkin tidak terbatas. Satu-satunya batasan adalah bahwa ia dapat meningkat paling banyak 1032 pada setiap iterasi.
PPS Angka 1032 mengasumsikan bahwa data file di zip terpisah. Satu kekhasan dari format file zip adalah bahwa ia memiliki direktori pusat yang mencantumkan file dalam arsip dan offset ke data file. Jika Anda membuat banyak entri file yang menunjuk ke data yang sama, Anda dapat mencapai rasio kompresi yang jauh lebih tinggi bahkan tanpa bersarang, tetapi file zip seperti itu kemungkinan akan ditolak oleh parser.
sumber
Cara yang bagus untuk membuat zipbomb (atau gzbomb) adalah mengetahui format biner yang Anda targetkan. Jika tidak, bahkan jika Anda menggunakan file streaming (misalnya menggunakan
/dev/zero
) Anda masih akan dibatasi oleh daya komputasi yang diperlukan untuk mengompresi aliran.Contoh yang bagus dari bom gzip: http://selenic.com/googolplex.gz57 (ada pesan yang tersemat di file setelah beberapa tingkat kompresi yang menghasilkan file besar)
Bersenang-senang menemukan pesan itu :)
sumber
Mungkin, di unix, Anda dapat menyalurkan sejumlah nol langsung ke program zip atau sesuatu? Tidak cukup tahu tentang unix untuk menjelaskan bagaimana Anda akan melakukannya. Selain itu Anda akan membutuhkan sumber nol, dan pipa mereka ke ritsleting yang dibaca dari stdin atau sesuatu ...
sumber
Semua algoritma kompresi file bergantung pada entropi informasi yang akan dikompresi. Secara teoritis Anda dapat memampatkan aliran 0 atau 1, dan jika cukup lama, itu akan memampatkan dengan sangat baik.
Itulah bagian teorinya. Bagian praktis telah ditunjukkan oleh orang lain.
sumber
Algoritma kompresi baru-baru ini (pasca 1995) seperti bz2, lzma (7-zip) dan rar memberikan kompresi spektakuler file monoton, dan satu lapisan kompresi cukup untuk membungkus konten yang terlalu besar ke ukuran yang dapat dikelola.
Pendekatan lain bisa dengan membuat file jarang dengan ukuran ekstrim (exabytes) dan kemudian kompres dengan sesuatu yang biasa yang mengerti file jarang (misalnya tar), sekarang jika pemeriksa mengalirkan file, pemeriksa perlu membaca melewati semua nol yang ada hanya untuk menghubungkan antara konten file yang sebenarnya, jika pemeriksa menulisnya ke disk, tetapi sangat sedikit ruang yang akan digunakan (dengan asumsi unarchiver berperilaku baik dan sistem file modern).
sumber
Sudah mencobanya. ukuran file zip output adalah file 84-KB kecil.
Langkah-langkah yang saya buat sejauh ini:
meskipun saya tidak tahu bagaimana menjelaskan bagian di mana kompresi file zip berganti nama masih kompres menjadi ukuran yang lebih kecil, tetapi berfungsi. Mungkin saya hanya kekurangan persyaratan teknis.
sumber
Silicon Valley Musim 3 Episode 7 membawaku ke sini. Langkah-langkah untuk menghasilkan bom ritsleting akan dilakukan.
1.zip
.n
(katakan 10) salinan file ini dan tambahkan 10 file ini ke arsip terkompresi (katakanlah2.zip
).k
beberapa kali.Untuk implementasi Python, periksa ini .
sumber
Saya tidak tahu apakah ZIP menggunakan Run Length Encoding, tetapi jika itu terjadi, file terkompresi seperti itu akan berisi sepotong kecil data dan nilai run-length yang sangat besar. Nilai run-length akan menentukan berapa kali potongan kecil data diulang. Ketika Anda memiliki nilai yang sangat besar, data yang dihasilkan proporsional besar.
sumber