3 puntos por GN⁺ 2024-05-09 | 1 comentarios | Compartir por WhatsApp
  • El crash de kill screen de NES Tetris puede usarse no solo como fin de partida, sino como un punto de entrada para ejecutar nuevo comportamiento en hardware y cartuchos sin modificar
  • Si el cálculo de puntaje después del nivel 155 no termina entre cuadros, el flujo de control puede corromperse y llevar a una ejecución de código arbitrario en la que el juego lee posiciones inesperadas de RAM como si fueran instrucciones
  • La RAM de entrada del puerto de controladores de expansión del Famicom se superpone con la ubicación de una rutina de salto, lo que permite manipular con los botones de los controles 3 y 4 la dirección a la que se moverá el juego tras el crash
  • Displaced Gamers publicó un código de prueba de concepto que envía el salto a la tabla de puntuaciones más altas para que los datos de nombres y puntajes se lean como opcodes del CPU del NES
  • Aunque su utilidad práctica es limitada por los caracteres disponibles y la falta de almacenamiento persistente, podría ampliarse para parchear el crash o incluso lograr control total de la RAM

Cómo un crash de kill screen se convierte en ejecución de código

  • El crash de NES Tetris puede ocurrir cuando el procesador de puntaje tarda demasiado en calcular la nueva puntuación entre cuadros
    • Esta situación puede aparecer después del nivel 155
    • Cuando se produce el retraso, parte del código de control es interrumpido por la rutina de escritura del nuevo cuadro
    • Luego, el juego salta a una ubicación de RAM no prevista para buscar la siguiente instrucción
  • Normalmente, ese salto inesperado hace que lea datos basura del inicio de la RAM como si fueran código, provocando un crash rápido
  • Un video reciente de Displaced Gamers muestra el procedimiento para hacer que NES Tetris lea la tabla de puntuaciones más altas como si fueran instrucciones en lenguaje máquina
    • Glitches similares de ejecución de código arbitrario ya se habían visto antes en Super Mario World, Paper Mario y The Legend of Zelda: Ocarina of Time
    • El método básico para inyectar código externo en NES Tetris se había teorizado públicamente al menos desde 2021, y según se informa, dentro de la comunidad ya se conocían desde hace tiempo formas de obtener control total de la RAM

Controlar la posición del salto con la entrada del Famicom

  • Este hack depende no solo de la forma en que Tetris se cuelga, sino también de la estructura de entrada del Famicom
  • A diferencia del NES estadounidense, el Famicom japonés tenía dos controles conectados de forma fija a la consola, y los controles de terceros podían conectarse al puerto de expansión frontal
  • El código de Tetris lee la entrada de ese puerto de controles “adicionales”
    • Con un adaptador, se pueden conectar dos controles estándar de NES adicionales
    • Famicom tuvo una versión separada de Tetris de Bullet-Proof Software, pero esta característica del manejo de entrada funciona en el código de NES Tetris
  • La región de RAM que procesa la entrada de esos controles adicionales se superpone con la ubicación en memoria de la rutina de salto usada durante el crash
    • Si el crash interrumpe la rutina de salto, esa RAM contiene datos que representan los botones presionados en los controles
    • El jugador puede usar esos valores para controlar con precisión a qué ubicación se moverá el código del juego después del crash

Leer la tabla de puntuaciones más altas como código ejecutable

  • El método de control del salto de Displaced Gamers requiere entradas específicas en los controles
    • Presionar up en el control 3
    • Presionar right, left y down en el control 4
    • Para introducir left y right al mismo tiempo, hace falta manipular el control
  • Esa entrada envía el código de salto al área de RAM donde se almacenan los nombres y puntajes de la lista de puntuaciones más altas del juego
  • Si se coloca (G en la posición objetivo de la tabla de puntuaciones más altas de B-Type, el juego vuelve a saltar a otra región de esa misma tabla
  • Después, el juego lee secuencialmente los nombres y puntajes y los procesa como opcodes del CPU del NES, en una técnica que Displaced Gamers describe como código “bare metal”

Lo que mostró la prueba de concepto: posibilidades y límites

  • El área de entrada para nombres en la tabla de puntuaciones más altas solo permite 43 símbolos, y los puntajes solo pueden contener 10 dígitos
    • Por esa restricción, solo una parte de los opcodes posibles en el NES puede “codificarse” en la tabla de puntuaciones más altas
  • Aun con entradas limitadas, fue posible crear un código de prueba de concepto corto
    • Los datos de ejemplo incluyen el nombre ))"-P) y un puntaje de A-Type en segundo lugar de 8,575
    • Esa rutina convierte en 0 los dos dígitos más altos del puntaje del juego
    • Reduce el tiempo de procesamiento del puntaje y con ello la causa del crash, pero si se sigue jugando, la puntuación volverá a entrar en la “zona de riesgo” del crash
  • El NES Tetris original no tiene almacenamiento con respaldo de batería, así que cada vez que se enciende la consola hay que volver a crear manualmente los puntajes necesarios y los nombres complejos
  • El espacio de la tabla de puntuaciones más altas también es limitado, por lo que es difícil insertar directamente programas complejos encima del código real de Tetris
  • HydrantDude escribió que existe un método para crear un bootstrapper con ciertas combinaciones de nombres y números en la tabla de puntuaciones, y luego usarlo para construir otro bootstrapper que permita obtener control total de la RAM

Posibilidades de reprogramación más allá de evitar el crash

  • Si se obtiene control total de la RAM, los jugadores de alto nivel podrían incluso recodificar el juego para parchear el bug del crash de NES Tetris
  • Este método podría ser especialmente útil para quienes intentan superar el nivel 255
    • Después del nivel 255, el juego vuelve al Level 0
  • Si se extiende todavía más el mismo principio, también podrían lograrse modificaciones como convertir Tetris en Flappy Bird, similar a lo que han hecho speedrunners de Super Mario World

1 comentarios

 
GN⁺ 2024-05-09
Opiniones en Hacker News
  • Cuando veo exploits así, siempre me acuerdo de la etapa final definitiva del hacking en Accelerando de Stross: “lanzar un ataque de canal lateral de temporización contra la superestructura computacional del propio espacio-tiempo, para meterse en algo que está por debajo”

    • No quisiera estar dentro del cono de luz de alguien que esté haciendo un intento con la más mínima posibilidad de éxito
      Suena como una excelente forma de provocar un decaimiento del vacío y que el universo saque pantalla azul
    • El libro se puede descargar gratis desde el blog del autor: https://www.antipope.org/charlie/blog-static/fiction/acceler...
    • Acabo de encontrar un error de sincronización, así que quizá sea un buen caso límite para empezar: https://www.science.org/content/article/quantum-paradox-poin...
    • Creo que a eso normalmente se le llama física
    • ¿Espacio-tiempo? ¿Por qué limitarse solo al espacio? El metatiempo es mucho más interesante
  • Me encanta esta gente
    Me hace sentir casi avergonzado no tener esa mentalidad hacker de intentar cosas que probablemente no sirvan para nada, solo por diversión

    • ¿La mayoría de esos hackers nacieron con un fideicomiso bajo el brazo? ¿Gente con el futuro asegurado y nada más que aburrimiento?
      El resto de nosotros está demasiado ocupado ganándose la vida como para tener tiempo para estos exploits; sin intención de hacer un juego de palabras
  • Si no quieres leer todo el artículo pero te preguntas “¿yo creía que los cartuchos de NES se ejecutaban desde ROM?”, sí
    Pero este exploit hace que la CPU salte a la RAM usada para guardar la tabla de puntajes máximos. Es realmente genial

  • El proceso para llegar a la ejecución de código arbitrario siempre es más interesante que lo que se hace después
    Es admirable la tenacidad de desarmar el juego para averiguar cuándo y dónde hace ese comportamiento, y encontrar qué hay que manipular para poder introducir instrucciones

    • Incluso después de encontrar el exploit, se puede crear algo realmente hermoso para que la consola lo ejecute
      Pokemon Yellow: https://www.youtube.com/watch?v=Vjm8P8utT5g
      Super Mario World: https://www.youtube.com/watch?v=hB6eY73sLV0
    • Me gusta especialmente el caso de Super Mario World
      La ejecución de código arbitrario se dispara con shellcode real. Literalmente se ejecuta manipulando un caparazón de Koopa dentro del juego
  • ¿Cuánto tardará alguien en correr Doom en Tetris?

    • Tal vez haga falta un cartucho de expansión de RAM para eso
  • Tiempo bien desperdiciado

    • ¿Qué haces por diversión? ¿También lo consideras una pérdida de tiempo?
      Lo pregunto en serio. Antes también consideraba que las cosas divertidas eran una pérdida de tiempo, pero después de pagar el precio de vivir mucho tiempo con mucho estrés, con los años empecé a pensarlo distinto
  • Quisiera intentar hacer esto con Factorio
    Algo como construir una computadora enorme hecha de cintas dentro de Factorio, provocar una falla de segmentación y hacer que escape del juego

  • Encontrar ejecución de código arbitrario en juegos antiguos es verdaderamente fascinante
    Cuando vi algo así en Super Mario World hace unos años, me obsesioné por un tiempo con entender cómo era posible
    Lo digo en buen sentido, como un elogio, aunque puede sonar un poco cruel: me encanta que gente realmente inteligente dedique una cantidad enorme de tiempo y esfuerzo a cosas completamente inútiles
    ¿Hay alguna razón inmediata para inyectar código en NES Tetris? Probablemente no. Pero ese no es el punto; el punto es descubrir qué es posible y hasta dónde se puede forzar código viejo y computadoras primitivas
    Quizá no sea “útil” en el sentido clásico, pero lo mismo vale para el sudoku, los crucigramas o jugar NES Tetris en primer lugar

    • Aunque quede oculto entre los detalles técnicos, este exploit también tiene un propósito práctico
      Permite que los jugadores expertos eviten los cuelgues que impiden seguir jugando después de cierto punto y puedan jugar más tiempo
      Para el jugador promedio no tiene utilidad práctica, pero para quienes quieren competir por los puntajes máximos resuelve un límite y abre nuevas posibilidades de competencia
    • Muchos descubrimientos científicos se hicieron gracias a que gente realmente inteligente dedicó tiempo y esfuerzo a cosas completamente inútiles
      La teoría de números originalmente también se consideraba inútil, pero hoy sostiene prácticamente toda la criptografía de clave pública
    • No es inútil. Les gusta hacerlo
      La utilidad que otros obtienen de cosas que hago pero no me gustan es un subproducto afortunado, o algo que me beneficia indirectamente, como dinero o reconocimiento
      Las cosas que hago porque me gustan son la forma más directa de utilidad para la persona más importante: uno mismo
    • El canal de YouTube de esta persona es la esencia de eso: https://www.youtube.com/@tom7
  • Honestamente, me sorprende que Tetris haya sido roto tan tarde
    Siento que esto abrirá una nueva era de runs any%. El objetivo sería ejecutar la escena final o los créditos del juego lo más rápido posible
    Mi ejemplo favorito es Ocarina of Time, que ya tenía exploits de ACE desde hace años
    El juego está tan roto que, manipulando la memoria del juego y editando cierto warp de entrada, se puede “terminar” en pocos minutos
    Lo más sorprendente es que la gente edita la memoria a mano, usando solo algunos botones y un joystick analógico
    Un caso que muestra los créditos en 3 minutos: https://www.speedrun.com/oot/runs/z1l1627m

    • Vi algo parecido en Super Mario
      Al encontrar una falla en un túnel de warp, se disparaba una lectura fuera de rango, y antes de eso se habían escrito, mediante movimientos del joystick, justo afuera del búfer los bytes que provocarían el comportamiento deseado
      En uno de los juegos de Pokemon, había que hacer un montón de compras/ventas para preparar la memoria con precisión, y luego provocar un overflow en la cantidad de ítems para disparar el salto
      Es algo realmente fantástico. Si algún día nos atacan los extraterrestres, estas travesuras nos salvarán
    • Solo por lo que se lee en el artículo, parece poco probable
      Este ACE parece requerir llegar primero a la kill screen
      Imagínate que el ACE de Ocarina of Time solo se activara después de que ya aparecieran los créditos finales: como solo ocurriría tras completar la run con éxito, no podría reducir el récord
    • Dices que te sorprende que Tetris haya sido roto tan tarde, pero me da curiosidad qué te hacía pensar que la ejecución arbitraria era posible antes
  • Me encanta este tipo de trabajo
    Me recuerda a cuando programaron Flappy Bird dentro de Super Mario World usando una falla. Una locura
    https://www.youtube.com/watch?v=hB6eY73sLV0