L’injection de code arbitraire, ou comment jouer à Flappy Bird dans Super Mario

L’injection de code arbitraire, ou comment jouer à Flappy Bird dans Super Mario

En exploitant des failles de jeux vidéo d’antan, des acharnés du modding arrivent à atteindre et modifier leur code source. Jusqu’à y injecter d’autres jeux.
24.6.16

Sur l'écran, ça fait presque une heure qu'un type est en train de jouer à Super Mario de la manière la plus étrange qu'on puisse imaginer et de diffuser sa performance en direct. On le voit, dans le coin gauche de la fenêtre de Twitch, égrener des suites de chiffres et de lettres à voix haute, qui ressemblent à des coordonnées sur un plan, avant de déplacer péniblement Mario de quelques pas, avec une précision millimétrée, et lui faire effectuer un petit saut tournoyant. « 315, F6…316, 32 et 33… » : vers la cinquante-troisième minute du live, la voix du joueur se fait plus rauque, le souffle plus appuyé, et les pauses entre chaque déplacement plus longues. Parqué dans le coin gauche de l'écran, affalé sur sa chaise de bureau, Seth Bling sourit nerveusement, la bouche crispée en une sorte de rire statufié. Lui seul sait ce qu'il va se passer, pendant que la fenêtre de chat dégueule un torrent de « putain mais il se passe quoi ? » de spectateurs incrédules. Visiblement, il se passe un truc, mais réservé aux initiés. 53 minutes et 10 secondes : sur l'écran, Mario stoppe enfin sa danse de Saint-Guy. Seth Bling regarde la caméra - « 16, 0…Vous êtes prêts ? C'est maintenant qu'on va savoir si j'ai fait une erreur ou… » - et presse un bouton. Le décor de Super Mario en négatif psychédélique s'évapore instantanément. Lorsque le plombier réapparaît dans sa sempiternelle salopette rouge, il flotte désormais dans les airs, sur le traditionnel papier peint vert imitation forêt du jeu original. Seth Bling, manette en main, est extatique. La fenêtre de chat de Twitch n'est plus qu'un tsunami de « WTF ». Le joueur vient de transformer Super Mario en Flappy Bird, en injectant le code entier du jeu mobile dans celui du jeu de Super Nes. Le tout à l'envers, bit par bit et à la seule force de la manette.

Dit comme ça, la performance paraît difficile à concevoir. Même les joueurs les plus zélés d'entre nous - ceux pour qui terminer un jeu vidéo à 100% est une question d'honneur chevaleresque - ne se sont probablement jamais dit qu'une chose aussi improbable qu'injecter un jeu vidéo dans un autre en utilisant deux gros boutons de manette de Super Nes était envisageable. Mais Seth Bling et ses disciples ne sont plus de simples joueurs depuis bien longtemps : eux sont de véritables modders, qui trouvent leur plaisir dans l'autopsie et la modification de codes sources de vieux titres de console de salon. Leur but ? Repérer les failles, les petits dérèglements et imperfections qui émaillent n'importe quel programme, les utiliser comme porte d'entrée dans les fondations du jeu et, une fois dans la matrice, rajouter des trucs de leur cru. Si vous avez eu dix ans dans les années 90, vous avez probablement possédé un Action Replay, une sorte de grosse cartouche qui renfermait - sans qu'on sache comment - les cheat codes pour débloquer tous les jeux de l'époque. Le principe était le même qu'aujourd'hui : exploiter des failles du jeu pour pénétrer dans son code et en prendre le contrôle, puis y entrer de nouvelles commandes (qui se trouvaient par pages entières dans le livre dédié au dispositif). Mais là où l'exploitation de bug est un tour de passe-passe très répandu dans le monde du jeu vidéo, Seth Bling et ses homologues vont beaucoup, beaucoup plus loin. Dans la hiérarchie du cheat, l'injection de code arbitraire est le stade ultime, le boss de fin au-delà duquel on peut considérer qu'un titre a été entièrement désossé. Et aucune plateforme ne se prête mieux à la pratique que Super Mario World (SMW), sorti sur la bonne vieille Super Nintendo en 1990.

Démolir Super Mario en cinq minutes

Publicité

Il faut dire que l'iconique titre est non seulement bourré de glitchs, mais permet en plus aux joueurs de foutre le bordel dans son code source en effectuant simplement des combinaisons de mouvements à l'intérieur du jeu, ce qui le rend bien plus ludique à hacker que la moyenne. Spécifiquement appelées exploits, ces opérations permettent au choix de vaincre Bowser et libérer Peach en quatre minutes trente et sans lâcher une goutte de sueur, de récupérer des vies à volonté, d'utiliser simultanément plusieurs super-pouvoirs disponibles dans le jeu ou de débloquer des niveaux improbables. Ces bugs, qui se jouent souvent au pixel près, sont quasi-impossibles à détecter pour un joueur humain, et ont donc presque tous été découverts récemment, en passant le jeu au scanner de programmes de débogage. Pour les mêmes raisons techniques, la majorité des modders s'appuie sur des émulateurs. Ces programmes permettent de programmer les déplacements et actions à faire pour compléter ces exploits et entrer à l'avance le code arbitraire à insérer dans le jeu, que ce soit dans Mario, Zelda ou Pokémon, sur Super Nes ou sur Wii. Une technique rodée, qui permettait par exemple à l'un des participants de l'Awesome Games Done Quick (AGDQ) 2014 de se faire une partie de Pong et de Snake dans Super Mario World, en direct et sous les rires de l'assistance.

Cette performance révèle quelque chose de fondamental sur l'architecture de tout système informatique : aucun programme n'est invulnérable dès lors qu'il est suffisamment déboussolé.

Mais Seth Bling, lui, n'est pas comme les autres modders, c'est un artisan. Emulateurs pour effectuer les exploits, mini-ordinateurs Raspberry Pi pour exécuter le code ? Trop facile. En janvier 2015, le Youtubeur devenait le premier à réussir manuellement le Credits Warp, une exploit permettant de terminer le jeu et d'afficher le générique de fin sans avoir à se coltiner Bowser. Une manipulation qui nécessite un timing inhumain, une connaissance parfaite de chaque centimètre carré du jeu et une maîtrise sans faille de la manette. Chrono ? Cinq minutes cinquante-neuf secondes six dixièmes. Le 29 mars dernier, il est donc également devenu le premier à réussir manuellement une injection de code arbitraire dans un jeu vidéo, avec l'aide du hacker p4plus2, qui a conçu la version de Flappy Bird adaptée au processeur 16-bit pour l'occasion.

Carapaces rouges et piratage informatique

D'accord, mais concrètement, ça se passe comment, une injection de code arbitraire à la main ? Dans une vidéo de vulgarisation salutaire postée dès le lendemain de sa performance, Seth Bling s'attaque à décortiquer et rendre compréhensible les différentes étapes nécessaires à sa réalisation. L'idée de départ est de « stresser » le jeu au point que celui-ci prenne certains mouvements du joueur pour des commandes informatiques effectuées en « langage assembleur »,le langage informatique le plus élémentaire après les 0 et les 1. Premièrement, explique-t-il, il faut s'en aller chercher Yoshi et posséder le pouvoir de lancer des boules de feu. A partir de là, exploiter un glitch appelé Powerup Incrementation, qui permet de superposer les états du personnage (0 étant l'état de base, 1 étant le Mario sous champi, 2 étant le Mario à la cape, 3 étant le Mario cracheur de feu). A l'état 6, qui n'existe pas « naturellement », la Super Nes ne comprend plus trop ce qu'il se passe. Le joueur peut alors écrire des commandes dans la RAM de la console en crachant des carapaces rouges à des endroits précis, sur un axe d'abscisse x, et activer ces commandes en gobant un champignon 1 UP. Cette technique lui permet de passer à l'état 22, quasi-similaire à l'état 6 mais avec une différence de taille : un simple champignon, beaucoup moins rare, suffit pour valider la commande.

Avec cet outil, le Youtubeur se code alors un délai de trois heures, histoire d'être tranquille. Puis, via une nouvelle série de commandes, se met à écrire des instructions non plus dans la RAM mais bien dans le code source de Super Mario World, spécifiquement dans un espace de mémoire, d'habitude vide, et lu très tôt par la RAM à chaque instant (frame) du jeu. Pour cette deuxième phase, appelée bootloader (les explications technique sont fournies par Seth Bling), il change de méthode ; à chaque fois qu'il déplace un interrupteur P à un endroit, l'abscisse de celui-ci est inscrite comme une commande dans une adresse du code source. Une adresse déterminée, elle, par la position de Mario à l'écran. Enfin, pour se faciliter un peu la tâche, Seth Bling transforme le compteur de pièces récoltées en un outil qui lui permet de savoir précisément, au pixel près, où Mario se trouve sur l'axe d'abscisse x, pour envoyer les commandes dans les bonnes adresses du code source. Après 20 minutes de boulot, désormais armé de ces outils, le modder peut se lancer dans le gros du travail : entrer patiemment les 331 bits du Flappy Bird modifié, un par un. Une seule erreur de placement, et toute la structure du programme s'effondre. Mais l'enchaînement de Seth Bling est parfait et après 53 minutes d'efforts, Mario se met à flotter dans les airs, comme prévu. Rideau.

En soi, l'injection de code arbitraire peut passer pour un délire réservé à quelques nerds en mal de vie sociale et sembler totalement anecdotique. Pourtant, cette performance révèle quelque chose de fondamental sur l'architecture de tout système informatique : aucun programme n'est invulnérable dès lors qu'il est suffisamment déboussolé. La technique utilisée par Seth Bling et les autres pour hacker Super Mario World, avec ou sans émulateur, appelée dépassement de tampon (buffer overflow), est transposable dans n'importe quelle machine. Le principe est simple : lorsqu'un programme s'exécute, les informations sont stockées dans une zone tampon, délimitée par une certaine taille. En donnant trop d'informations au programme d'un coup, on force celui-ci à les stocker hors de cette zone, ce qui le fait planter. Le bug peut ensuite être exploité, grâce à une injection de code, pour outrepasser les protocoles de sécurité d'un système. Popularisé par un célèbre article du magazine de hacking Phrack paru en 1996 et intitulé « Smashing the stack for fun and profit », le procédé est reconnu comme l'une des armes historiques de l'arsenal des pirates informatiques. Seth Bling et sa Super Nes craquée n'en sont que la version fréquentable.