3 puntos por GN⁺ 2023-08-12 | 1 comentarios | Compartir por WhatsApp
  • OFRAK Tetris es un juego tipo Tetris en el navegador donde caen instrucciones ARM; en vez de acomodar bloques, colocas instrucciones para crear el flujo de ejecución de un programa
  • Los gadgets de instrucciones que van cayendo se rotan y luego se fijan, y solo se ejecutan las instrucciones fijadas que están en la parte superior de la pantalla
  • La puntuación se guarda en la dirección de memoria apuntada por R12, y puedes seguir el estado viendo R0~R12, LR, PC, SP y el volcado de memoria
  • Si se acaba el tiempo o ocurre un acceso de memoria inválido o un salto a una dirección incorrecta, aparece Game over y la ejecución termina
  • Con opciones como ejecución paso a paso, alternar música, instrucciones lógicas, modo infinito, intervalo de caída y tamaño máximo de gadget, se puede ajustar la dificultad y la forma de ejecución

Tetris que avanza con instrucciones ARM

  • OFRAK Tetris es un juego tipo Tetris donde caen gadgets compuestos por instrucciones ARM
  • El usuario rota las instrucciones que van cayendo y luego las fija a la izquierda para construir el flujo de ejecución
  • Reglas de ejecución

    • Las instrucciones caen de arriba hacia abajo
    • El usuario rota y fija las instrucciones
    • De las instrucciones fijadas, solo se ejecuta la instrucción que está más arriba

Estado de ejecución visible en pantalla

  • Se muestra la instrucción que se va a ejecutar junto con su dirección actual
    • Ej.: add PC, PC, #61
    • Ej.: 00010000, 00010004, 00010008
  • Puedes seguir el resultado de la ejecución viendo el estado de los registros y la memoria
    • Se muestran los valores de R0~R12, LR, PC y SP
    • El área de memoria se muestra con direcciones hexadecimales y valores rellenados con ceros
    • La puntuación se muestra como Score: 0

Guardado de puntuación y condiciones de fin del juego

  • La puntuación se guarda en la dirección de memoria apuntada por R12
  • El juego termina si ocurre cualquiera de las siguientes situaciones
    • Se acaba el tiempo
    • Se accede a memoria inválida
    • Se salta a una dirección incorrecta
  • En la pantalla final aparecen Game over. y un campo para ingresar la puntuación más alta

Controles y configuración

  • Los controles básicos incluyen ejecución paso a paso, fijar gadget, rotación de registros, reproducir/pausar música y mostrar/ocultar la explicación
  • También se ofrece configuración de asignación de botones para gamepad
    • Single Step

    • Toggle Music

    • Lock In

    • Rotate Instructions Up / Down / Left / Right

      • Toggle Game Instructions
      • En la configuración del juego se pueden ajustar las condiciones de ejecución y la dificultad
      • Score multiplier
      • Enable Logical Instructions
      • Infinite mode
      • Seconds between drops
      • Maximum gadget size

Evento presencial en DEF CON

  • Quienes estén en DEF CON pueden visitar la mesa de Red Balloon Security para jugar Tetris juntos en el Car Hacking Village
  • Quienes logren una puntuación suficientemente alta recibirán premios

1 comentarios

 
GN⁺ 2023-08-12
Opiniones en Hacker News
  • Desde la perspectiva de un programador con muy poca experiencia trabajando en ensamblador, es una herramienta genial para aprender.
    Tenía una chuleta abierta en otra pestaña para ver qué hacía cada instrucción.
    Aunque fue un poco decepcionante que mi primer segfault hiciera que mi puntaje máximo saliera como -4.800 millones :-P

  • ¡Está buenísimo! Hasta ahora mi puntaje máximo llegó a 65612.
    Como feedback, cuando abrí el menú de ayuda no quedaba claro cómo cerrarlo; parece que solo se puede presionando ? otra vez.
    Me gusta la música de Goblin, y también la interfaz y la codificación por colores para jugar con las instrucciones.
    Creo que un modo sandbox, donde puedas previsualizar el efecto de ejecutar una instrucción y modificar el programa después de que termine el juego, sería bastante útil para alguien que esté aprendiendo ensamblador ARM.

    • Me gusta la idea del modo sandbox.
      Después de jugar unas horas mientras hacía este juego, definitivamente empecé a leer ensamblador ARM más rápido.
  • No pude evitar reírme al leer “el puntaje se almacena en la memoria de la dirección a la que apunta R12”.
    Gracias por compartirlo; me hizo extrañar DEFCON. Supongo que recién podré ir el año que viene.

    • ¿Puedes contar por qué te dio risa lo de R12?
    • Como alguien que casi no sabe qué son las instrucciones o las direcciones, me da curiosidad a qué se refiere “el puntaje se almacena en la memoria de la dirección a la que apunta R12”.
      Tenía la página abierta antes de que respondieran, así que no vi la respuesta hasta que actualicé.
  • Hasta ahora he encontrado dos buenas estrategias.
    La primera es repartir el PC en tantos registros como sea posible, sumar esos registros tantas veces como se pueda y luego guardar la suma en la dirección 0 o donde esté el puntaje.
    La segunda es leer en un registro, como entero, una instrucción ensamblada a partir de un valor anterior del PC; como normalmente se ve negativa, hacer que deje de serlo con una resta y luego guardarla en la ubicación del puntaje.
    Me da curiosidad qué estrategias han probado los demás.

  • El concepto está buenísimo, pero mi comprensión del ensamblador es demasiado baja :)
    Dice que el puntaje se guarda en R12, pero R12 es 0; no entiendo por qué el puntaje es 16.
    https://imgur.com/a/RY5jhTu

    • R12 contiene la dirección del puntaje.
      En este caso es la dirección 0, es decir, el inicio del segmento de datos.
      El registro del puntaje está en amarillo, y la zona de memoria a la que apunta ese registro, es decir los bytes reales del puntaje, también se muestran en amarillo.
  • Me manejo bien con computadoras y sé algo de ensamblador básico, pero wow, esto no lo entendí para nada.

    • Si tienes alguna duda concreta, puedo explicarla.
      En términos más generales, también me interesan ideas sobre cómo hacer que el juego sea más claro.
      Sé que un manual que explique las instrucciones ayudaría, pero cualquier otra idea es bienvenida.
  • Una hermosa UI/UX brutalista.

  • Antes de probarlo, hice clic en “About” y se abrió una página nueva que decía: “Si sigues usando este sitio, aceptas el uso de cookies”.
    Parece una violación del GDPR. Rechazar las cookies debería ser tan fácil como aceptarlas.
    Sobre todo porque esas cookies ni siquiera parecen ser necesarias para que el sitio funcione.
    “El servicio usa cookies y tecnologías similares, como pixel tags, web beacons, clear GIFs y JavaScript, para que nuestros servidores reconozcan tu navegador web, sepan cuándo visitas y usas el servicio, analicen tendencias, entiendan nuestra base de usuarios y operen y mejoren el servicio … También podemos complementar la información recopilada con información recibida de terceros, incluidas cookies colocadas en tu dispositivo por terceros”.
    https://ofrak.com/privacy/#tracking-tools-and-opt-out
    Que al final de la página digan que borres las cookies desde la configuración del navegador no es una solución aceptable.

    • Lamentablemente, estas prácticas ocurren en muchos sitios web, y muchas empresas no cumplen correctamente con la ley de cookies.
      https://www.cnil.fr/en/refusing-cookies-should-be-easy-accep...
    • De mi lado no guarda nada ilegal, solo configuración del juego; no sé por qué aparece ese banner.
    • Indicarle al visitante de un sitio que desactive las cookies en el navegador es exactamente el método que también usa apple.com.
  • Me pregunto cómo se compila el juego.
    Revisé https://ofrak.com/docs/environment-setup.html, pero no encontré nada específico sobre el juego de Tetris.
    Puede que se me haya pasado.

  • Me encanta el concepto.
    La clave para obtener un puntaje alto parece ser escribir 0 en el PC.
    Esto se debe a que el código binario de la nueva instrucción se “agrega” al área de memoria que se ve a la derecha, y después puedes manipular R12 para maximizar el puntaje.

    • Otra clave es cambiar R12 a un valor que no sea divisible por 4.
      Porque todas las instrucciones son de 4 bytes y el bit más significativo siempre es 1.
      Algunas veces llegué a unos 2.000 millones, pero el promedio es bastante bajo ;)