3 pontos por GN⁺ 2023-08-12 | 1 comentários | Compartilhar no WhatsApp
  • OFRAK Tetris é um jogo no estilo Tetris no navegador em que instruções ARM caem, e em vez de encaixar blocos, você posiciona instruções para criar o fluxo de execução de um programa
  • Os gadgets de instrução que caem são rotacionados e depois fixados, e apenas as instruções fixadas que estão no topo da tela são executadas
  • A pontuação é armazenada no endereço de memória apontado por R12, e é possível acompanhar o estado observando R0~R12, LR, PC, SP e o dump de memória
  • Quando o tempo acaba, ocorre um acesso inválido à memória ou um salto para um endereço incorreto, aparece Game over e a execução é encerrada
  • Com opções como execução em passo único, alternância de música, instruções lógicas, modo infinito, intervalo entre quedas e tamanho máximo do gadget, é possível ajustar a dificuldade e a forma de execução

Tetris conduzido por instruções ARM

  • OFRAK Tetris é um jogo no estilo Tetris em que gadgets compostos por instruções ARM caem
  • O usuário rotaciona as instruções que estão caindo e depois as fixa à esquerda para criar o fluxo de execução
  • Regras de execução

    • As instruções caem de cima para baixo
    • O usuário rotaciona e fixa as instruções
    • Entre as instruções fixadas, apenas a instrução no topo é executada

Estado da execução visível na tela

  • A instrução atualmente em execução e seu endereço são exibidos juntos
    • Ex.: add PC, PC, #61
    • Ex.: 00010000, 00010004, 00010008
  • É possível acompanhar os resultados da execução observando os registradores e o estado da memória
    • Os valores de R0~R12, LR, PC e SP são exibidos
    • A área de memória é mostrada com endereços hexadecimais e valores preenchidos com zero
    • A pontuação aparece como Score: 0

Armazenamento da pontuação e condições de fim de jogo

  • A pontuação é armazenada no endereço de memória apontado por R12
  • O jogo termina quando ocorre qualquer uma das situações abaixo
    • O tempo acaba
    • Há acesso a memória inválida
    • Há um salto para um endereço incorreto
  • A tela de encerramento mostra Game over. e uma área para inserir a pontuação máxima

Controles e configurações

  • Os controles padrão incluem execução em passo único, fixar gadget, rotacionar registradores, reproduzir/pausar música e mostrar/ocultar explicações
  • Também há configuração de key bindings para gamepad
    • Single Step

    • Toggle Music

    • Lock In

    • Rotate Instructions Up / Down / Left / Right

      • Toggle Game Instructions
      • Nas configurações do jogo, é possível ajustar as condições de execução e a dificuldade
      • Score multiplier
      • Enable Logical Instructions
      • Infinite mode
      • Seconds between drops
      • Maximum gadget size

Evento presencial na DEF CON

  • Usuários que estiverem na DEF CON podem visitar a mesa da Red Balloon Security para jogar Tetris no Car Hacking Village
  • Quem conseguir uma pontuação suficientemente alta receberá um prêmio

1 comentários

 
GN⁺ 2023-08-12
Comentários no Hacker News
  • Do ponto de vista de um programador com pouquíssima experiência trabalhando com assembly, é uma ferramenta incrível para aprender.
    Eu deixei uma cheat sheet aberta em outra aba para ver o que cada instrução fazia.
    Só fiquei um pouco decepcionado porque o primeiro segfault fez a pontuação máxima aparecer como -4,8 bilhões :-P

  • Muito legal! Até agora, minha maior pontuação foi 65612.
    Como feedback, quando abri o menu de ajuda não ficou claro como fechá-lo; parece que só dá para apertar ? de novo.
    Gostei da música do Goblin, e também da interface para brincar com as instruções e da diferenciação por cores.
    Um modo sandbox em que fosse possível ver antecipadamente o efeito da execução das instruções e modificar o programa depois que o jogo terminasse seria bastante útil para quem está aprendendo assembly ARM.

    • Gostei da ideia do modo sandbox.
      Depois de passar algumas horas jogando enquanto fazia este jogo, minha velocidade de leitura de assembly ARM definitivamente aumentou.
  • Não consegui deixar de rir ao ver “a pontuação é armazenada na memória no endereço apontado por R12”.
    Obrigado por compartilhar; me deu saudade da DEFCON. Talvez eu só consiga ir no ano que vem.

    • Pode explicar por que você riu por causa do R12?
    • Como alguém que quase não sabe o que são instruções ou endereços, fiquei curioso sobre o que “a pontuação é armazenada na memória no endereço apontado por R12” quer dizer.
      Eu estava com a página aberta antes da resposta, então não vi as respostas até atualizar.
  • Até agora, encontrei duas boas estratégias.
    A primeira é espalhar o PC pelo maior número possível de registradores, somar esses registradores o máximo de vezes possível e depois armazenar a soma no endereço 0 ou na posição onde fica a pontuação.
    A segunda é ler para um registrador, como inteiro, uma instrução montada a partir de um valor antigo do PC; como ela normalmente aparece como negativa, uso subtração para torná-la não negativa e então a armazeno na posição da pontuação.
    Fico curioso para saber quais estratégias outras pessoas tentaram.

  • O conceito é muito legal, mas meu entendimento de assembly é baixo demais :)
    Diz que a pontuação fica armazenada em R12, mas não entendo por que a pontuação é 16 se R12 é 0.
    https://imgur.com/a/RY5jhTu

    • R12 contém o endereço da pontuação.
      Neste caso, é o endereço 0, ou seja, o início do segmento de dados.
      O registrador da pontuação está em amarelo, e a região de memória correspondente para a qual esse registrador aponta — isto é, os bytes reais da pontuação — também aparece em amarelo.
  • Sou familiarizado com computadores e conheço um pouco de assembly básico, mas, uau, não entendi absolutamente nada disso.

    • Se houver algo específico que você queira saber, posso explicar.
      De forma mais ampla, também tenho interesse em ideias de como tornar o jogo mais claro.
      Sei que um manual explicando as instruções ajudaria, mas outras ideias também são bem-vindas.
  • Uma bela UI/UX brutalista.

  • Antes de experimentar, cliquei em “About” e uma nova página abriu dizendo: “Ao continuar usando este site, você concorda com o uso de cookies”.
    Parece uma violação da GDPR. Recusar cookies precisa ser tão fácil quanto aceitá-los.
    Especialmente porque esses cookies nem parecem ser necessários para o funcionamento do site.
    “O serviço usa cookies e tecnologias semelhantes, como pixel tags, web beacons, clear GIFs e JavaScript, para permitir que nossos servidores reconheçam seu navegador, entendam quando você visita e usa nossos serviços, analisem tendências, entendam nossa base de usuários e operem e melhorem nossos serviços … Também podemos complementar as informações que coletamos com informações recebidas de terceiros, inclusive cookies colocados no seu dispositivo por terceiros.”
    https://ofrak.com/privacy/#tracking-tools-and-opt-out
    Dizer, no fim da página, para apagar cookies nas configurações do navegador não é uma solução aceitável.

    • Infelizmente, essa prática acontece em muitos sites, e muitas empresas não cumprem corretamente a lei de cookies.
      https://www.cnil.fr/en/refusing-cookies-should-be-easy-accep...
    • Do meu lado, ele não armazenou nada ilegal, só configurações do jogo; não sei por que esse banner aparece.
    • Orientar visitantes do site a desativar cookies no navegador é exatamente a abordagem que a apple.com também usa.
  • Fiquei curioso sobre como compilar o jogo.
    Dei uma olhada em https://ofrak.com/docs/environment-setup.html, mas não encontrei nada específico sobre o jogo de Tetris.
    Talvez eu tenha deixado passar algo.

  • Gostei muito do conceito.
    A chave para conseguir uma pontuação alta parece ser escrever 0 no PC.
    Isso porque o código binário da nova instrução é “adicionado” à área de memória mostrada à direita, e depois você pode manipular R12 para maximizar a pontuação.

    • Outra chave é mudar R12 para um valor que não seja divisível por 4.
      Isso porque todas as instruções têm 4 bytes e o bit mais significativo é sempre 1.
      Algumas vezes cheguei a cerca de 2 bilhões, mas a média é bem baixa ;)