Des hackers découvrent comment reprogrammer NES Tetris depuis le jeu
(arstechnica.com)- Le crash de l’écran de fin de NES Tetris n’est pas seulement une fin de partie : il peut servir de point d’entrée pour exécuter de nouveaux comportements sur du matériel et une cartouche non modifiés
- Après le niveau 155, si le calcul du score ne se termine pas entre deux frames, le flux de contrôle se rompt et le jeu peut lire par erreur certains emplacements de RAM comme des instructions, menant à une exécution de code arbitraire
- Sur la Famicom, la RAM d’entrée du port d’extension des manettes chevauche l’emplacement d’une routine de saut, ce qui permet de manipuler l’adresse vers laquelle le jeu se déplace après le crash via les boutons des manettes 3 et 4
- Displaced Gamers a publié un code de preuve de concept qui envoie la cible du saut vers la table des meilleurs scores, afin que le jeu lise les noms et les scores comme des opcodes du CPU de la NES
- Son utilité pratique reste limitée par les caractères et chiffres saisissables ainsi que par l’absence de stockage, mais la méthode pourrait être étendue à des correctifs anti-crash ou à un contrôle complet de la RAM
Comment le crash de l’écran de fin se transforme en exécution de code
- Le crash de NES Tetris peut se produire lorsque le gestionnaire de score met trop de temps à calculer le nouveau score entre deux frames
- Cette situation peut apparaître après le niveau 155
- En cas de délai, une partie du code de contrôle est interrompue par la routine d’écriture de la nouvelle frame
- Ensuite, le jeu saute vers un emplacement de RAM non prévu pour trouver l’instruction suivante
- En général, ce saut inattendu amène le jeu à lire comme du code des données parasites au début de la RAM, provoquant un crash rapide
- Une récente vidéo de Displaced Gamers détaille une procédure permettant à NES Tetris de lire la table des meilleurs scores comme des instructions en langage machine
- Des glitchs similaires d’exécution de code arbitraire étaient déjà connus dans Super Mario World, Paper Mario et The Legend of Zelda: Ocarina of Time
- La méthode de base pour injecter du code externe dans NES Tetris était publiquement théorisée depuis au moins 2021, et il se dit que la communauté connaissait depuis longtemps des méthodes de contrôle complet de la RAM
Contrôler l’emplacement du saut via la gestion des entrées de la Famicom
- Ce hack repose non seulement sur la façon dont Tetris plante, mais aussi sur la structure des entrées de la Famicom
- Contrairement à la NES américaine, la Famicom japonaise avait deux manettes reliées directement à la console, tandis que les manettes tierces pouvaient être connectées au port d’extension en façade
- Le code de Tetris lit les entrées de ce port de manettes « supplémentaire »
- Avec un adaptateur, il est possible de connecter deux manettes NES standard supplémentaires
- La Famicom disposait d’une version distincte de Tetris par Bullet-Proof Software, mais cette particularité de gestion des entrées fonctionne dans le code de NES Tetris
- La zone de RAM qui traite les entrées des manettes supplémentaires chevauche l’emplacement mémoire de la routine de saut utilisée lors du crash
- Lorsque la routine de saut est interrompue par le crash, cette RAM contient des données représentant les boutons pressés sur les manettes
- Le joueur peut utiliser ces valeurs pour contrôler précisément l’endroit où le code du jeu se rend après le crash
Lire la table des meilleurs scores comme du code exécutable
- La méthode de contrôle du saut de Displaced Gamers nécessite des entrées de manette spécifiques
- Appuyer sur
upsur la manette 3 - Appuyer sur
right,leftetdownsur la manette 4 - Pour saisir
leftetrightsimultanément, il faut modifier la manette
- Appuyer sur
- Ces entrées envoient le code de saut vers la zone de RAM où sont stockés les noms et les scores de la liste des meilleurs scores du jeu
- Placer
(Gà l’emplacement ciblé de la table des meilleurs scores en B-Type fait ensuite ressauter le jeu vers une autre zone de la table des meilleurs scores - Le jeu lit alors les noms et les scores séquentiellement et les traite comme des opcodes du CPU de la NES, selon une approche que Displaced Gamers appelle du code “bare metal”
Possibilités et limites montrées par la preuve de concept
- La zone de saisie des noms des meilleurs scores ne permet d’utiliser que 43 symboles, et les scores ne peuvent contenir que 10 chiffres
- À cause de cette contrainte, seule une partie des opcodes possibles sur NES peut être « codée » dans la table des meilleurs scores
- Même avec ces entrées limitées, un court code de preuve de concept a pu être réalisé
- Les données d’exemple incluent le nom
))"-P)et un score de 8 575 en deuxième position du mode A-Type - Cette routine met à 0 les deux chiffres les plus significatifs du score en jeu
- Elle réduit le temps de traitement du score et donc la cause du crash, mais si l’on continue à jouer, le score finit de nouveau par atteindre la « zone à risque » de crash
- Les données d’exemple incluent le nom
- NES Tetris de base ne dispose pas de sauvegarde sur batterie : à chaque mise sous tension, il faut donc recréer manuellement les meilleurs scores et les noms complexes nécessaires
- L’espace de la table des meilleurs scores est également limité, ce qui rend difficile l’insertion directe de programmes complexes par-dessus le code réel de Tetris
- HydrantDude écrit qu’il existe une méthode consistant à créer un bootstrapper à partir d’une combinaison précise de noms et de chiffres dans les meilleurs scores, puis à créer un autre bootstrapper pour obtenir un contrôle complet de la RAM
Des correctifs anti-crash à la reprogrammation
- Si un contrôle complet de la RAM devient possible, les meilleurs joueurs pourraient aussi recoder le jeu afin de corriger le bug de crash de NES Tetris
- Cette méthode pourrait être particulièrement utile aux joueurs qui tentent de dépasser le niveau 255
- Après le niveau 255, le jeu revient au Level 0
- En poussant le même principe plus loin, il serait aussi possible de transformer Tetris en Flappy Bird, comme dans certains exemples de speedrunners sur Super Mario World
1 commentaires
Commentaires sur Hacker News
Chaque fois que je vois ce genre d’exploit, je pense toujours au stade ultime du hacking décrit dans Accelerando de Stross : « lancer une attaque par canal temporel contre la superstructure computationnelle de l’espace-temps lui-même, pour tenter de percer jusqu’à ce qu’il y a en dessous »
Ça ressemble à une excellente façon de provoquer une désintégration du vide et de faire afficher un écran bleu à l’univers
J’adore vraiment ce genre de personnes
J’en viens presque à avoir honte de ne pas avoir cet esprit hacker qui pousse à faire des choses probablement inutiles juste pour le plaisir
Nous autres, on est trop occupés à gagner notre vie pour avoir le temps de faire ce genre d’exploit, sans jeu de mots
Je n’ai pas envie de lire l’article en entier, mais si vous vous demandez « les cartouches NES ne s’exécutent pas depuis la ROM ? », si
Sauf que cet exploit amène le CPU à sauter vers la RAM utilisée pour stocker le tableau des meilleurs scores. Vraiment génial
Le chemin qui mène à l’exécution de code arbitraire est toujours plus intéressant que ce qu’on en fait ensuite
La ténacité qu’il faut pour disséquer le jeu, comprendre quand et où il peut se comporter ainsi, puis trouver quoi manipuler pour pouvoir y injecter des instructions est impressionnante
Pokemon Yellow : https://www.youtube.com/watch?v=Vjm8P8utT5g
Super Mario World : https://www.youtube.com/watch?v=hB6eY73sLV0
L’exécution de code arbitraire y déclenche un véritable shellcode. Littéralement exécuté dans le jeu en manipulant des carapaces de Koopa
Combien de temps avant que quelqu’un ne fasse tourner Doom dans Tetris ?
Voilà du temps bien gaspillé
Je pose la question sincèrement. Avant, je voyais aussi les activités amusantes comme une perte de temps, mais en vieillissant et en payant le prix d’une vie de stress prolongé, je vois les choses autrement
J’aimerais essayer ça dans Factorio
Construire un énorme ordinateur en tapis roulants dans Factorio, puis provoquer une segmentation fault pour s’échapper hors du jeu
Trouver de l’exécution de code arbitraire dans de vieux jeux est vraiment fascinant
Quand j’ai vu quelque chose comme ça dans Super Mario World il y a quelques années, j’ai été obsédé un moment par la question de savoir comment c’était possible
Je le dis dans le bon sens, comme un compliment, même si ça peut sembler un peu méchant : j’aime voir des gens vraiment intelligents consacrer énormément de temps et d’efforts à des choses totalement inutiles
Y a-t-il une raison immédiate d’injecter du code dans NES Tetris ? Probablement pas. Mais ce n’est pas là l’essentiel : il s’agit de découvrir ce qui est possible et jusqu’où on peut forcer du vieux code et des ordinateurs primitifs à aller
Ce n’est peut-être pas « utile » au sens classique du terme, mais c’est aussi le cas du sudoku, des mots croisés, ou même du fait de jouer à NES Tetris au départ
Il permet aux joueurs de haut niveau de continuer à jouer plus longtemps en évitant le crash qui bloque la partie après un certain point
Ce n’est pas utile pour le joueur moyen, mais pour ceux qui visent le meilleur score, cela lève une limite et ouvre de nouvelles possibilités de compétition
La théorie des nombres aussi était jadis jugée inutile, alors qu’aujourd’hui elle soutient pratiquement toute la cryptographie à clé publique
L’utilité que les autres tirent de choses que je n’aime pas mais que je fais vient soit d’un heureux effet secondaire, soit d’un bénéfice indirect pour moi, comme l’argent ou la reconnaissance
Ce qu’on fait par plaisir est la forme d’utilité la plus directe pour la personne la plus importante, c’est-à-dire soi-même
Franchement, je suis surpris que Tetris n’ait été cassé que si tard
J’ai l’impression que ça pourrait lancer une nouvelle ère des runs any% dont le but serait de déclencher le plus vite possible la scène de fin ou les crédits du jeu
Mon exemple préféré est Ocarina of Time, qui avait déjà des exploits ACE il y a des années
Le jeu est tellement cassé qu’en manipulant sa mémoire et en modifiant certains warps d’entrée, on peut le « finir » en quelques minutes
Plus impressionnant encore, les gens modifient la mémoire à la main, avec seulement quelques boutons et le joystick analogique
Un exemple de crédits affichés en 3 minutes : https://www.speedrun.com/oot/runs/z1l1627m
En trouvant un défaut dans un tunnel de warp, cela déclenchait une lecture hors limites, et auparavant le joueur avait écrit via les mouvements du joystick les octets qui provoqueraient les effets voulus juste en dehors du buffer
Dans l’un des jeux Pokemon, il fallait faire un grand nombre d’achats et de ventes pour préparer précisément la mémoire, puis provoquer un overflow du nombre d’objets afin de déclencher le saut
C’est absolument fantastique. Si des extraterrestres nous attaquent un jour, ce sont ce genre de bidouillages qui nous sauveront
Cet ACE semble exiger d’atteindre d’abord le kill screen
C’est comme si l’ACE d’Ocarina of Time ne se déclenchait qu’après le défilement des crédits de fin : si cela n’arrive qu’une fois la partie déjà terminée avec succès, ça ne peut pas améliorer le record
J’adore vraiment ce genre de travail
Ça me rappelle quand quelqu’un avait programmé Flappy Bird dans Super Mario World en exploitant des glitches. C’est complètement dingue
https://www.youtube.com/watch?v=hB6eY73sLV0