Peretas menemukan cara memprogram ulang NES Tetris dari dalam game
(arstechnica.com)- Crash kill screen di NES Tetris ternyata bukan sekadar akhir permainan, melainkan dapat dipakai sebagai titik masuk untuk menjalankan perilaku baru pada perangkat keras dan kartrid yang tidak dimodifikasi
- Jika perhitungan skor setelah level 155 tidak selesai di antara frame, alur kontrol bisa rusak dan game dapat membaca lokasi RAM yang tidak semestinya sebagai instruksi, yang berujung pada eksekusi kode arbitrer
- RAM input port controller ekspansi pada Famicom bertumpang tindih dengan lokasi rutin lompatan, sehingga input tombol pada controller 3 dan 4 dapat dipakai untuk mengatur alamat tujuan setelah crash
- Displaced Gamers merilis kode proof-of-concept yang mengarahkan target lompatan ke tabel skor tertinggi, sehingga data nama dan skor dibaca seperti opcode CPU NES
- Kegunaannya masih terbatas karena karakter dan angka yang bisa dimasukkan sedikit serta tidak ada media penyimpanan, tetapi ada kemungkinan diperluas menjadi patch penghindar crash atau kontrol penuh atas RAM
Bagaimana crash kill screen berubah menjadi eksekusi kode
- Crash di NES Tetris dapat terjadi ketika pemroses skor memerlukan waktu terlalu lama untuk menghitung skor baru di antara frame
- Situasi ini bisa muncul setelah level 155
- Saat terjadi jeda, sebagian kode kontrol terputus oleh rutin penulisan frame baru
- Setelah itu, game melompat ke lokasi RAM yang tidak dimaksudkan untuk mencari instruksi berikutnya
- Biasanya, lompatan tak terduga ini membuat data sampah di bagian awal RAM dibaca seperti kode dan memicu crash lanjutan dengan cepat
- Video terbaru Displaced Gamers memaparkan prosedur untuk membuat NES Tetris membaca tabel skor tertinggi seperti instruksi bahasa mesin
- Glitch eksekusi kode arbitrer serupa sebelumnya juga telah dikenal pada Super Mario World, Paper Mario, dan The Legend of Zelda: Ocarina of Time
- Cara dasar memasukkan kode eksternal ke NES Tetris setidaknya sudah diteorikan secara terbuka sejak 2021, dan metode untuk memperoleh kontrol penuh atas RAM kabarnya juga sudah lama dikenal di dalam komunitas
Mengendalikan posisi lompatan lewat pemrosesan input Famicom
- Peretasan ini bergantung bukan hanya pada cara Tetris mengalami crash, tetapi juga pada struktur input Famicom
- Famicom versi Jepang, tidak seperti NES versi Amerika, memiliki dua controller yang terhubung tetap ke unit utama, sementara controller pihak ketiga dapat dihubungkan ke port ekspansi di bagian depan
- Kode Tetris membaca input dari port controller “tambahan” ini
- Dengan adapter, dua controller NES standar tambahan juga dapat dihubungkan
- Famicom memang memiliki versi Tetris terpisah dari Bullet-Proof Software, tetapi karakteristik pemrosesan input ini bekerja pada kode NES Tetris
- Area RAM yang memproses input controller tambahan bertumpang tindih dengan lokasi memori rutin lompatan yang dipakai saat crash
- Jika crash memutus rutin lompatan, RAM tersebut berisi data yang mewakili tombol yang ditekan pada controller
- Pemain dapat memakai nilai ini untuk mengendalikan secara presisi ke mana kode game berpindah setelah crash
Membaca tabel skor tertinggi seperti kode yang dijalankan
- Metode pengendalian lompatan dari Displaced Gamers memerlukan input controller tertentu
- Tekan
uppada controller 3 - Tekan
right,left, dandownpada controller 4 - Untuk memasukkan
leftdanrightsecara bersamaan diperlukan manipulasi controller
- Tekan
- Input ini mengirim kode lompatan ke area RAM tempat nama dan skor pada daftar skor tertinggi game disimpan
- Jika
(Gditempatkan pada posisi target di tabel skor tertinggi B-Type, game akan melompat lagi ke area lain dalam tabel skor tertinggi - Setelah itu, game membaca nama dan skor secara berurutan lalu memprosesnya seperti opcode CPU NES, dengan cara yang oleh Displaced Gamers disebut kode “bare metal”
Kemungkinan dan batasan yang ditunjukkan proof-of-concept
- Area input nama skor tertinggi hanya mendukung 43 simbol, dan skor hanya dapat berisi 10 digit angka
- Karena batasan ini, hanya sebagian opcode yang mungkin di NES yang bisa “ditulis” ke dalam tabel skor tertinggi
- Bahkan dengan input yang terbatas, kode proof-of-concept singkat tetap dimungkinkan
- Contoh datanya mencakup nama
))"-P)dan skor peringkat 2 A-Type sebesar 8.575 - Rutin ini membuat dua digit tertinggi dari skor game menjadi 0
- Ini mengurangi waktu pemrosesan skor sehingga menurunkan penyebab crash, tetapi jika permainan diteruskan skor tetap akan kembali mencapai “zona bahaya” crash
- Contoh datanya mencakup nama
- NES Tetris standar tidak memiliki media penyimpanan dengan battery backup, jadi setiap kali dinyalakan pemain harus membuat sendiri skor tertinggi dan nama rumit yang diperlukan
- Ruang tabel skor tertinggi juga terbatas, sehingga sulit menaruh program kompleks langsung di atas kode Tetris yang sesungguhnya
- HydrantDude menulis bahwa ada pendekatan membuat bootstrapper dari kombinasi nama dan angka skor tertinggi tertentu, lalu membuat bootstrapper lain untuk memperoleh kontrol penuh atas RAM
Kemungkinan pemrograman ulang di luar sekadar menghindari crash
- Jika kontrol penuh atas RAM dapat diperoleh, pemain papan atas mungkin bisa menulis ulang game agar menambal bug crash di NES Tetris
- Pendekatan ini bisa sangat membantu bagi pemain yang ingin melampaui level 255
- Setelah level 255, game kembali ke Level 0
- Jika prinsip yang sama dikembangkan lebih jauh, modifikasi seperti mengubah Tetris menjadi Flappy Bird, sebagaimana pernah dilakukan speedrunner Super Mario World, juga mungkin terjadi
1 komentar
Komentar Hacker News
Eksploit seperti ini selalu mengingatkanku pada tahap akhir pamungkas peretasan dalam Accelerando karya Stross: “melakukan serangan timing channel terhadap superstruktur komputasional ruang-waktu itu sendiri, untuk menerobos ke sesuatu yang ada di bawahnya”
Kedengarannya seperti cara yang sangat bagus untuk memicu peluruhan vakum dan membuat alam semesta mengalami blue screen
Aku sangat suka orang-orang seperti ini
Aku sampai merasa malu karena tidak punya mentalitas hacker yang mencoba hal-hal yang kemungkinan besar tidak berguna hanya demi kesenangan
Kami yang lain terlalu sibuk mencari nafkah sampai tidak punya waktu untuk eksploit seperti ini, tanpa maksud bermain kata
Kalau tidak ingin membaca seluruh tulisannya tapi penasaran “bukannya kartrid NES berjalan dari ROM?”, benar
Namun eksploit ini membuat CPU melompat ke RAM untuk menyimpan tabel skor tertinggi. Benar-benar keren
Proses mencapai eksekusi kode arbitrer selalu lebih menarik daripada apa yang dilakukan setelahnya
Kegigihan membongkar game untuk mengetahui kapan dan di mana perilaku seperti itu terjadi, lalu menemukan bagian mana yang harus dimanipulasi agar bisa memasukkan instruksi, sungguh mengagumkan
Pokemon Yellow: https://www.youtube.com/watch?v=Vjm8P8utT5g
Super Mario World: https://www.youtube.com/watch?v=hB6eY73sLV0
Eksekusi kode arbitrer dipicu dengan shellcode sungguhan. Secara harfiah dijalankan dengan memanipulasi cangkang Koopa di dalam game
Berapa lama sampai seseorang menjalankan Doom di dalam Tetris?
Waktu yang terbuang dengan benar
Aku bertanya dengan tulus. Dulu aku juga menganggap hal-hal menyenangkan sebagai buang-buang waktu, tetapi setelah membayar harga dari kehidupan penuh stres yang berlangsung lama, semakin tua aku semakin berpikir berbeda
Aku ingin mencoba ini dengan Factorio
Membuat komputer raksasa dari belt di dalam Factorio, lalu membuat segmentation fault agar keluar dari game
Menemukan eksekusi kode arbitrer di game lama benar-benar memikat
Ketika melihat hal seperti ini di Super Mario World beberapa tahun lalu, aku sempat sangat terpaku pada bagaimana itu bisa mungkin
Ini kumaksudkan dengan baik, sebagai pujian, meski mungkin terdengar agak jahat: aku suka melihat orang-orang yang benar-benar pintar mencurahkan banyak sekali waktu dan upaya untuk sesuatu yang sepenuhnya tidak berguna
Apakah ada alasan langsung untuk menyuntikkan kode ke NES Tetris? Mungkin tidak. Tapi intinya bukan itu, melainkan mencari tahu apa yang mungkin dilakukan dan seberapa jauh kode lama serta komputer primitif bisa dipaksa bekerja
Dalam pengertian klasik mungkin tidak “berguna”, tetapi begitu juga sudoku, teka-teki silang, atau bermain NES Tetris sejak awal
Ini memungkinkan pemain tingkat tinggi bermain lebih lama dengan menghindari crash yang mencegah permainan setelah titik tertentu
Bagi pemain rata-rata tidak praktis, tetapi bagi orang yang ingin bersaing mencetak skor tertinggi, ini mengatasi batasan dan membuka kemungkinan kompetisi baru
Teori bilangan dulu juga dianggap tidak berguna, tetapi sekarang pada dasarnya menopang semua kriptografi kunci publik
Kegunaan yang didapat orang lain dari hal yang kulakukan meski tidak kusukai hanyalah hasil sampingan yang beruntung, atau memberi manfaat tidak langsung kepadaku seperti uang atau pengakuan
Hal yang dilakukan karena disukai menjadi bentuk kegunaan paling langsung bagi orang yang paling penting, yaitu diri sendiri
Sejujurnya aku terkejut Tetris baru berhasil ditembus selambat ini
Sepertinya ini akan membuka era baru run any%. Tujuannya adalah menjalankan adegan akhir atau credit game secepat mungkin
Contoh favoritku adalah Ocarina of Time, yang sudah punya eksploit ACE sejak beberapa tahun lalu
Gamenya benar-benar rusak, sehingga dengan memanipulasi memori game dan mengedit warp masuk tertentu, game bisa “ditamatkan” dalam beberapa menit
Yang lebih menakjubkan adalah orang-orang mengedit memori dengan tangan, hanya memakai beberapa tombol dan joystick analog
Contoh memunculkan credit dalam 3 menit: https://www.speedrun.com/oot/runs/z1l1627m
Saat menemukan cacat pada terowongan warp, itu memicu pembacaan di luar batas, dan sebelumnya mereka sudah menulis byte tepat di luar buffer lewat manipulasi joystick untuk memicu perilaku yang diinginkan
Di salah satu game Pokemon, untuk menyiapkan memori dengan tepat, mereka harus melakukan banyak transaksi beli/jual, lalu membuat jumlah item overflow untuk memicu jump
Benar-benar fantastis. Suatu hari kalau alien menyerang, keisengan seperti ini akan menyelamatkan kita
ACE ini sepertinya baru sah setelah mencapai kill screen
Bayangkan ACE di Ocarina of Time baru aktif setelah credit akhir bergulir; karena hanya terjadi setelah berhasil menyelesaikan run, itu tidak bisa memangkas rekor
Aku sangat suka pekerjaan semacam ini
Ini mengingatkanku pada saat orang memprogram Flappy Bird di dalam Super Mario World dengan memanfaatkan glitch. Benar-benar gila
https://www.youtube.com/watch?v=hB6eY73sLV0