Bir çatal bomba nasıl çalışır?


22
  • UYARI ÜRETİM MAKİNESİNDE BU ÇALIŞMAYA ÇALIŞMAYIN

Konuyla ilgili Wikipedia sayfasını okurken, genellikle aşağıdaki kodda neler olduğunu takip ediyorum:

:(){ :|:& };:

tanımdan alıntı

Aşağıdaki çatal bomba 2002 yılında sanat olarak sunuldu;56'nın kesin kökeni bilinmemektedir, ancak 2002'den önce Usenet'te bulunmaktadır. Bomba, aşağıdaki 13 karakterin bash veya zsh gibi bir UNIX kabuğuna yapıştırılmasıyla gerçekleştirilir . Kendini iki kez çağıran, bir kez ön planda ve bir kez de arka planda bir kez ':' adında bir fonksiyon tanımlayarak çalışır.

Ancak son parça bana tamamen açık değil. Fonksiyon tanımını görüyorum:

:(){ ... }

Ama başka neler oluyor? Aynı zamanda ksh, benzer bir şey inşa edebilmek için aynı kaderi gibi csh, ve tcshaynı zamanda diğer kabukları da çekiyor musunuz?


2
Bu, borsa borsalarında oldukça sık ortaya çıkıyor, iyi bir cevap burada: stackoverflow.com/questions/991142/…
Drav Sloan

@DravSloan - Bu içeriğin bir kısmını burada oluşturmaya çalışıyordum, sorum biraz bu şekilde yüklendi.
slm

Zorunlu olarak eklemek istersiniz "Tanrı aşkına bunu bir üretim makinesinde çalıştırmayın ya da makineyi kullanmaya devam etmek istiyorsanız!" mesaj :)
Drav Sloan

1
@ MartinSchröder - bu sorunun sorulmasına neden olanın ne olduğunu biliyor musunuz? 8-). Bu cuma gecesi bir şey almak için sordum ve sonra diğer soru bir ya da 2 saat sonra geldi.
slm

1
@ MartinSchröder - onları ayrı olarak bırakmak en iyisidir, biraz farklıdırlar. Bu, çatal bombalarının nasıl çalıştığına dair ayrıntılı bir görüş istiyor, diğeri ise sistemin bir çatal bomba içinde nasıl çatallaştığı konusundaki mekanizma hakkında ayrıntılı bilgi istiyordu. B / c ile ilişkili olduklarının kafa karıştırıcı göründüğünü biliyorum ama farklılar (IMO - belli ki). Diğer Q'yu bile cevapladım ve çatalları süren kaputun altındaki mekanizmayı göstermeye çalıştım, ve bunu çift olarak işaretlemedim.
slm

Yanıtlar:


23

Bu çatal bomba bana her zaman bir AI programlama öğretmeninin katıldığı ilk derslerden birinde "Özyineyi anlamak için önce özyinelemeyi anlamalısınız" demiştir.

Özünde, bu bomba özyinelemeli bir fonksiyondur. Temelde, sistem kaynakları tüketilene kadar, kendini çağıran, kendini çağıran, kendini çağıran bir işlev yaratırsınız. Bu özel örnekte, özyineleme, fonksiyonun kendisine borulanması ve arka planın kullanılmasıyla güçlendirilir.

Bunu StackOverflow'ta cevaplandığını gördüm ve orada verilen örneğin en iyi şekilde gösterdiğini düşünüyorum, çünkü bir bakışta ne yaptığını görmek daha kolay (yukarıdaki bağlantıdan çalındı ​​...)

☃(){ ☃|☃& };☃

☃() { ... }Gövde kendisini çağıran bug işlevini , hata işlevini tanımlayan bug işlevini tanımlayın ve ☃|☃sonucu arka planda bırakın &. Ardından, işlev tanımlandıktan sonra, aslında bug işlevini çağırın ; ☃,.

En azından Arch VM'mde, sürecin arka planında bulunma ihtiyacının, aynı sonuç sonucuna sahip olma, mevcut tüm işlem alanını tüketme ve ana bilgisayarı b0rked hale getirme zorunluluğu olmadığını unutmayın. Aslında şimdi, kaçma işlemini bazen sonlandırıyor gibi göründüğünü ve bir perdeden sonra bir -bash: fork: Resource temporarily unavailableile duracağını Terminated(ve journalctlbash core damping'i gösterdiğini) söyledim .

Csh / tcsh hakkındaki sorunuza cevap vermek için, bu kabukların hiçbiri işlevleri desteklemez, yalnızca takma ad kullanabilirsiniz. Bu kabuklar için, özyinelemeli olarak adlandıran bir kabuk betiği yazmanız gerekecek.

zsh, aynı kaderi paylaşıyor (aynı kodla), çekirdeği boşa çıkarmıyor ve Arch'ın vermesine neden oluyor Out of memory: Kill process 216 (zsh) score 0 or sacrifice child., ancak hala çatallanmaya devam ediyor. Bir süre sonra ifade eder Killed process 162 (systemd-logind) ...(ve yine de çatal bıçak zsh yapmaya devam eder).

Arch'ın pacmanksh sürümü yok gibi görünüyor , bu yüzden debian'da denemek zorunda kaldım. ksh :, bir işlev ismi olarak nesneleri kullanır , fakat bir şey kullanmak - saymak b()yerine istenen sonucu elde etmiş gibi görünür.


Bu karakterler nedir? Onların böcek olduklarını biliyorum ama onları nasıl yaptın?
slm

10
Küçük bir yazı tipi boyutunda bir böcek gibi gözükse de, aslında bir kardan adam olduğunu göreceksiniz. Bu, boşluksuz & # x 2603 girilerek html olarak gösterilebilen unicode karakter U + 2603 olur.
sambler,

2
Görünüşe göre Linux altında çok sayıda Gnome ile ilgili uygulama ve Firefox Ctrl+Shift+u+<hex>, hex'in görüntülemek istediğiniz unicode karakterinin hex kodunu desteklediğini gösteriyor. Görüntülenebilir bir unicode listesi şu adreste bulunabilir: fileformat.info/info/unicode/utf8test.htm (garip olanların çoğu "çeşitli" bölümlerindedir). Windows superuser.com/questions/47420/… adresini ziyaret etmelidir ve bağlantıda belirtilen aracı kişisel olarak kullanmalıyım unicodeinput.exeya da tarayıcımdan kesip yapıştırmalıyım. Sambler tarafından önerilen şekilde her zaman html dizilerini kullanabilirsiniz.
Drav Sloan

1
Wiki'de ayrıca unicode karakterlerin bir listesi vardır: en.wikipedia.org/wiki/List_of_Unicode_characters
Drav Sloan

Kardan adam böceği sevdim, burada kullandığınız sistemde görüntülenmiyor, hex içinde altıgen sayılar bulunan bir kutu gibi gözüküyor.
terdon
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.