Giriş
Muhtemelen zip bombaları , XML bombaları vb. İle aşinasınızdır . Basitçe söylemek gerekirse, bunlar naif yazılım tarafından yorumlandığında çok büyük çıktılar üreten (nispeten) küçük dosyalardır. Buradaki zorluk, bir derleyiciyi aynı şekilde kötüye kullanmaktır.
Meydan okuma
512 bayt veya daha az yer kaplayan ve en fazla yer kaplayan bir dosyada derlenen bazı kaynak kodlarını yazın. En büyük çıktı dosyası kazanır!
kurallar
Tamam, birkaç önemli açıklama, tanım ve kısıtlama var;
- Derlemenin çıktısı bir ELF dosyası, bir Windows Taşınabilir Yürütülebilir (.exe) veya JVM veya .Net’in CLR’si için sanal bytecode olmalıdır (istendiğinde diğer sanal bytecode türlerinin de tamam olması olasıdır). Güncelleme: Python'un .pyc / .pyo çıktısı da sayılır .
- Seçtiğiniz dil doğrudan bu biçimlerden birinde derlenemezse, aktarımın ardından derlemeye de izin verilir ( Güncelleme: aynı dili hiçbir zaman bir defadan fazla kullanmayacağınız sürece), birden çok kez kopyalayabilirsiniz .
- Kaynak kodunuz birden fazla dosyadan ve hatta kaynak dosyalardan oluşabilir, ancak tüm bu dosyaların toplam boyutu 512 baytı geçmemelidir.
- Kaynak dosyalarınızdan ve seçtiğiniz dilinizin standart kitaplığından başka bir girdi kullanamazsınız. Statik bağlama standart kütüphaneler desteklendiğinde sorun yok. Özellikle, üçüncü taraf kütüphaneleri veya işletim sistemi kütüphaneleri yok.
- Derlemenizi bir komut veya bir komut dizisi kullanarak çağırmanız mümkün olmalıdır. Derleme sırasında belirli bayraklara ihtiyacınız varsa, bunlar bayt sınırınıza göre sayılır (örneğin, derleme satırınız ise
gcc bomb.c -o bomb -O3 -lm
,-O3 -lm
kısım (7 bayt) sayılır (başlangıçtaki boşluğun sayılmadığına dikkat edin). - Önişlemcilere sadece kendi diliniz için standart bir derleme seçeneği olması durumunda izin verilir .
- Çevre size kalmış, ancak bunu doğrulanabilir kılmak için lütfen yeni (yani mevcut) derleyici sürümlerine ve işletim sistemlerine bağlı kalın (ve hangisini kullandığınızı açıkça belirtin).
- Hatasız derleme yapmalıdır (uyarılar uygun) ve derleyicinin çökmesi bir şey sayılmaz.
- Programınızın gerçekte yaptığı şey alakasız, ancak zararlı bir şey olamaz. Başlayabilmesi bile gerekmez.
örnek 1
C programı
main(){return 1;}
İle Derleyen Apple LLVM version 7.0.2 (clang-700.1.81)
OS X 10.11 (64-bit) üzerinde:
clang bomb.c -o bomb -pg
9228 baytlık bir dosya üretir. Toplam kaynak büyüklüğü 17 + 3'tür (bunun için -pg
) = 20 bayttır, kolayca boyut sınırı içindedir.
Örnek 2
Brainfuck programı:
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.
Awib ile c ile transpillendi :
./awib < bomb.bf > bomb.c
Sonra Apple LLVM version 7.0.2 (clang-700.1.81)
OS X 10.11 (64 bit) ile derlendi :
clang bomb.c
8464 baytlık bir dosya üretir. Buradaki toplam giriş 143 bayttır (çünkü @lang_c
awib için varsayılan değerdir, kaynak dosyaya eklenmesi gerekmez ve her iki komutta da özel bayrak yoktur).
Ayrıca, bu durumda, geçici bomb.c dosyasının 802 bayt olduğunu, ancak bunun kaynak boyutuna veya çıktı boyutuna sayılmadığını unutmayın.
Son not
4GB'tan daha fazla bir çıktı elde edilirse (belki birileri bir turing tam işlemciyi bulursa), rekabet en azından bu boyutta bir dosya üreten en küçük kaynak için olacaktır ( çok büyük olan gönderimleri test etmek pratik değildir ) .