- NES Tetris'in kill screen çökmesi, yalnızca oyunun bitmesi değil; değiştirilmemiş donanım ve kartuş üzerinde yeni davranışlar çalıştırmak için bir giriş noktası olarak kullanılabiliyor
- Seviye 155'ten sonra skor hesaplaması kareler arasında tamamlanmazsa denetim akışı bozulabiliyor ve oyun, amaçlanmayan RAM konumlarını komutmuş gibi okuyarak rastgele kod çalıştırma durumuna gidebiliyor
- Famicom'un genişletme kontrolcü portu giriş RAM'i, atlama rutininin konumuyla çakıştığı için 3. ve 4. kontrolcü düğme girdileriyle çökmeden sonra gidilecek adres manipüle edilebiliyor
- Displaced Gamers, atlama hedefini yüksek skor tablosuna yönlendirip ad ve skor verilerini NES CPU opcode'ları gibi okutabilen bir kavram kanıtlama kodu yayımladı
- Girilebilen karakterler ve rakamlar ile kalıcı depolama olmaması nedeniyle pratikliği sınırlı olsa da, çökme önleme yamaları ya da tüm RAM'in kontrolüne kadar genişleyebilecek bir potansiyel taşıyor
Kill screen çökmesinin kod çalıştırmaya dönüşme süreci
- NES Tetris'teki çökme, skor işleyicisinin yeni skoru kareler arasında hesaplamak için fazla uzun sürmesiyle ortaya çıkabiliyor
- Bu durum Seviye 155'ten sonra görülebiliyor
- Gecikme oluştuğunda denetim kodunun bir kısmı yeni kare yazma rutini tarafından yarıda kesiliyor
- Ardından oyun, bir sonraki komutu bulmak için amaçlanmayan bir RAM konumuna atlıyor
- Normalde bu beklenmedik atlama, RAM'in baş tarafındaki çöp verilerin kod gibi okunmasına yol açıyor ve bu da hızlı bir çöküşle sonuçlanıyor
- Displaced Gamers'ın son videosu, NES Tetris'in yüksek skor tablosunu makine dili komutlarıymış gibi okumasını sağlayan süreci ortaya koyuyor
- Benzer rastgele kod çalıştırma glitch'leri daha önce Super Mario World, Paper Mario ve The Legend of Zelda: Ocarina of Time'da da bilinmekteydi
- NES Tetris'e dışarıdan kod sokmanın temel yöntemi en az 2021'den beri kamuya açık biçimde teorileştirilmişti ve topluluk içinde tüm RAM'i kontrol etme yönteminin de uzun süredir bilindiği aktarılıyor
Famicom giriş işleme ile atlama konumunu kontrol etme
- Bu hack yalnızca Tetris'in çökme biçimine değil, aynı zamanda Famicom giriş yapısına da dayanıyor
- Japonya sürümü Famicom'da, ABD sürümü NES'ten farklı olarak iki kontrolcü cihaza sabit bağlıydı ve üçüncü taraf kontrolcüler ön taraftaki genişletme portuna takılabiliyordu
- Tetris kodu, bu “ek” kontrolcü portunun girdilerini okuyor
- Adaptör kullanılırsa iki standart NES kontrolcüsü daha bağlanabiliyor
- Famicom için Bullet-Proof Software'in ayrı bir Tetris sürümü bulunsa da, bu giriş işleme özelliği NES Tetris kodunda çalışıyor
- Ek kontrolcü girdilerini işleyen RAM alanı, çökme sırasında kullanılan atlama rutininin bellek konumuyla çakışıyor
- Çökme nedeniyle atlama rutini yarıda kesildiğinde bu RAM alanında kontrolcüde basılan düğmeleri temsil eden veriler bulunuyor
- Oyuncu bu değerleri kullanarak, çökmeden sonra oyun kodunun nereye gideceğini hassas biçimde kontrol edebiliyor
Yüksek skor tablosunu çalıştırılabilir kod gibi okutmak
- Displaced Gamers'ın atlama denetimi yöntemi belirli kontrolcü girdileri gerektiriyor
-
- kontrolcüde
upbasılı olmalı
- kontrolcüde
-
- kontrolcüde
right,left,downbasılı olmalı
- kontrolcüde
leftverightdeğerlerini aynı anda girmek için kontrolcü üzerinde özel bir işlem gerekiyor
-
- Bu girişler, atlama kodunu oyunun yüksek skor listesindeki adların ve skorların tutulduğu RAM alanına yönlendiriyor
- B-Type yüksek skor tablosundaki hedef konuma
(Ggirildiğinde oyun, yüksek skor tablosunun başka bir alanına yeniden atlıyor - Ardından oyun, adları ve skorları sırayla okuyup Displaced Gamers'ın “bare metal” kod diye adlandırdığı biçimde bunları NES CPU opcode'ları olarak işliyor
Kavram kanıtının gösterdiği olanaklar ve sınırlamalar
- Yüksek skor adı giriş alanında yalnızca 43 sembol kullanılabiliyor ve skorlara da yalnızca 10 rakam girilebiliyor
- Bu kısıt nedeniyle NES'te mümkün olan opcode'ların yalnızca bir kısmı yüksek skor tablosuna “kodlanabiliyor”
- Sınırlı girişe rağmen kısa bir kavram kanıtlama kodu mümkün oldu
- Örnek veriler arasında
))"-P)adlı isim ve A-Type ikincilik skoru olarak 8,575 yer alıyor - Bu rutin, oyun skorunun en yüksek iki basamağını 0 yapıyor
- Skor işleme süresini azaltarak çökme nedenini hafifletiyor, ancak oyun devam ettikçe skor yeniden çökme “risk bölgesine” ulaşıyor
- Örnek veriler arasında
- Temel NES Tetris'te pille yedeklenen bir kayıt aygıtı bulunmadığından, cihaz her açıldığında gerekli yüksek skorları ve karmaşık isimleri elle yeniden oluşturmak gerekiyor
- Yüksek skor tablosu alanı da sınırlı olduğundan, Tetris'in gerçek kodu üzerine doğrudan karmaşık programlar yerleştirmek zor
- HydrantDude, belirli yüksek skor adları ve rakam kombinasyonlarıyla bir bootstrapper oluşturup, ardından başka bir bootstrapper ile tüm RAM üzerinde kontrol elde etmenin mümkün olduğunu yazıyor
Çökme önlemenin ötesinde yeniden programlama ihtimali
- Tüm RAM üzerinde kontrol mümkün hale gelirse üst düzey oyuncular, NES Tetris'in çökme hatasını yamalayacak şekilde oyunu yeniden kodlayabilir
- Bu yöntem özellikle Seviye 255'in ötesine geçmek isteyen oyuncular için yararlı olabilir
- Seviye 255'ten sonra oyun yeniden Level 0'a dönüyor
- Aynı ilke daha da genişletilirse, Super Mario World speedrunner örneğinde olduğu gibi Tetris'i Flappy Bird'e dönüştüren türden değişiklikler de mümkün olabilir
1 yorum
Hacker News yorumları
Bu tür exploit’leri görünce aklıma hep Stross’un Accelerando eserindeki hack’lemenin nihai son aşaması geliyor: “uzay-zamanın hesaplamalı üst yapısına bir zamanlama kanalı saldırısı uygulayıp onun altındaki bir şeye sızmaya çalışmak”
Vakum çöküşünü tetikleyip evrene mavi ekran verdirmek için harika bir yol gibi geliyor
Bu insanları gerçekten seviyorum
Büyük ihtimalle işe yaramayacak bir şeyi sırf eğlencesine yapabilen o hacker zihniyetine sahip olmadığım için utanacak gibi oluyorum
Geri kalanımız böyle exploit’lerle uğraşacak vakit bulamayacak kadar geçim derdinde, kelime oyunu amaçlı değil
Yazının tamamını okumak istemiyorsanız ama “NES kartuşları ROM’dan çalışmıyor muydu?” diye merak ediyorsanız, evet öyle
Ama bu exploit CPU’nun yüksek skor tablosunu kaydetmek için kullanılan RAM’e atlamasını sağlıyor. Gerçekten çok havalı
İsteğe bağlı kod çalıştırmaya ulaşma süreci, sonrasında ne yaptığınızdan her zaman daha ilginç geliyor
Oyunu tersine mühendislikle inceleyip bunun ne zaman ve nerede mümkün olduğunu bulmak ve komutları girebilmek için nereyi manipüle etmek gerektiğini keşfetmek gerçekten hayranlık uyandırıcı bir azim
Pokemon Yellow: https://www.youtube.com/watch?v=Vjm8P8utT5g
Super Mario World: https://www.youtube.com/watch?v=hB6eY73sLV0
İsteğe bağlı kod çalıştırma gerçekten shellcode olarak tetikleniyor. Kelimenin tam anlamıyla oyun içinde Koopa kabuklarını manipüle ederek çalıştırılıyor
Birinin Tetris’te Doom çalıştırması ne kadar sürer acaba?
Tam anlamıyla boşa harcanmış zaman
Gerçekten soruyorum. Eskiden ben de eğlenceli şeyleri zaman kaybı sayardım ama uzun süreli yüksek stresli bir hayatın bedelini ödedikçe ve yaş aldıkça farklı düşünmeye başladım
Bunu Factorio’da denemek isterdim
Kemerlerden dev bir bilgisayar yapıp onu Factorio’nun içinde kurmak ve bir segmentation fault üretip oyunun dışına kaçmasını sağlamak gibi
Eski oyunlarda isteğe bağlı kod çalıştırma bulmak gerçekten büyüleyici
Birkaç yıl önce Super Mario World’de buna benzer bir şey gördüğümde bunun nasıl mümkün olduğuna bir süre takılıp kalmıştım
İyi niyetle, iltifat olarak söylüyorum ama biraz kaba gelebilir: gerçekten zeki insanların tamamen işe yaramaz şeylere inanılmaz zaman ve emek harcamasını seviyorum
Şu anda NES Tetris’e kod enjekte etmenin somut bir nedeni var mı? Muhtemelen yok. Ama mesele bu değil; mesele neyin mümkün olduğunu ve eski kodla ilkel bilgisayarlara ne kadar şey zorla yaptırılabileceğini keşfetmek
Klasik anlamda “yararlı” olmayabilir ama sudoku, çengel bulmaca ya da en başta NES Tetris oynamak da öyle
Üst düzey oyuncuların belli bir noktadan sonra oynamasını engelleyen çökmeden kaçınarak daha uzun süre oynamalarını sağlıyor
Ortalama oyuncu için pratik olmayabilir ama en yüksek skor için yarışanlar açısından bir sınırı ortadan kaldırıyor ve yeni rekabet olanakları açıyor
Sayılar teorisi de bir zamanlar işe yaramaz sayılıyordu ama bugün fiilen tüm açık anahtarlı şifrelemenin temelini oluşturuyor
Başkalarının, benim sevmeden yaptığım işlerden elde ettiği fayda ya şanslı bir yan ürün ya da para ya da takdir gibi bana dolaylı yarar sağlayan bir şeydir
Severek yapılan iş, en önemli kişi olan insanın kendisi için en doğrudan yarar biçimidir
Açıkçası Tetris’in bu kadar geç kırılmış olmasına şaşırdım
Bunun yeni bir any% koşu dönemini başlatacağını düşünüyorum. Amaç, oyunun bitiş sahnesini ya da jeneriğini mümkün olan en kısa sürede çalıştırmak olur
En sevdiğim örnek Ocarina of Time; orada zaten yıllardır ACE exploit’leri vardı
Oyun tamamen bozuk durumda olduğu için oyun belleğini manipüle edip belli giriş warp’larını düzenleyerek birkaç dakikada “bitirmek” mümkün
Daha da etkileyici olan, insanların bunu elleriyle, sadece birkaç düğme ve analog joystick kullanarak belleği düzenleyerek yapması
3 dakikada jeneriği açan bir örnek: https://www.speedrun.com/oot/runs/z1l1627m
Warp tünelindeki bir hata bulununca sınır dışı okuma tetikleniyordu ve ondan önce joystick hareketleriyle buffer’ın hemen dışına istenen davranışı oluşturacak baytlar yazılıyordu
Pokemon oyunlarından birinde de belleği tam hazırlamak için bir sürü alım-satım işlemi yapmak, ardından item sayısını overflow’a sokup zıplamayı tetiklemek gerekiyordu
Gerçekten olağanüstü bir şey. Bir gün uzaylılar saldırırsa bizi kurtaracak olan bunlar olacak
Bu ACE’in gerçekleşmesi için önce kill screen’e ulaşmak gerekiyor gibi görünüyor
Ocarina of Time’daki ACE’in ancak bitiş jeneriği akmaya başladıktan sonra tetiklendiğini düşünün; bu durumda zaten başarıyla tamamlamış olursunuz, dolayısıyla süre rekorunu kısaltamaz
Bu tür işleri gerçekten seviyorum
Super Mario World içinde glitch kullanarak Flappy Bird programlandığını hatırlattı. Çılgınlık seviyesinde bir şeydi
https://www.youtube.com/watch?v=hB6eY73sLV0