Meio Bit » Arquivo » Games » Geek usa bugs do Super Mario World pra injetar novo código e jogar Pong

Geek usa bugs do Super Mario World pra injetar novo código e jogar Pong

Geek ajuda a combater o câncer com um projeto sensacional, estudando desenvolvimento de games, enfiando um Pong dentro do Mario e se divertindo entre amigos. Not bad.

10 anos atrás

2pong_mario

Taí uma coisa que não vemos todos os dias. Mas para contextualizar, preciso explicar um pouco o que é o Games Done Quick. Já ouviu falar de videogame speed runs? Esse é o nome dado à prática de "quebrar" um jogo, explorar seus glitches e falhas no código, virá-lo do avesso, para poder chegar ao seu final o mais rápido possível.

O Games Done Quick, um evento apresentado pelo site Speed Demos Archive, é justamente uma maratona de speed run. A edição de 2014 terminou há alguns dias, durou uma semana e levantou fundos para projetos de prevenção do Câncer. Suas palestras foram transmitidas online, por streaming de vídeo.

Super Mario World (U)016

Pois bem. Em uma das oficinas, o tutor conectou um computador Raspberry Pi a um Super Nintendo e utilizou um bug do jogo Super Mario World para acessar seu program counter, o que permite que a pessoa possa "pular" para um endereço arbitrário de memória.

Só que em vez de pular para o final do jogo, objetivo de um speed run, o autor da brincadeira deu um jeito de criar um ambiente de programação no qual você pode utilizar os controles para escrever qualquer programa. No video abaixo, você pode ver o personagem Yoshi pulando de um lado para o outro, no já conhecido "Bug do Yoshi", dando início ao exploit:

Normalmente, podemos utilizar um comando JMP para para ir ao final do game, ou qualquer endereço que você queira, como demonstrado aqui:

ADDR | VALUE | INTERPRETED AS
-----------------------------------------------------
0x1000 CONTROLLER 1 ASM INSTRUCTION payload
0x1001 CONTROLLER 2 ASM INSTRUCTION payload
0x1002 CONTROLLER 3 ASM INSTRUCTION payload
0x1003 CONTROLLER 4 ASM INSTRUCTION payload
0x1004 CONTROLLER 5 ASM INSTRUCTION payload
0x1005 CONTROLLER 6 ASM INSTRUCTION payload
0x1006 JMPSHORT jmpshort -8
0x1007 -8 # jump back up to 0x1000

Só que desta vez, em vez de executar o speed run clássico, ele usou o joypad para inserir o código de um novo jogo, abrindo o frame e introduzindo os códigos enquanto a CPU os executa. Sem KY.

Confira o resultado:

Se você reparar bem, dá pra ver em 1:40s o momento no qual o cara configura o bootstrapper para copiar o programa. Em 1:41, seria o ponto no qual costumeiramente o Tool-assisted speedrun(TAS) iria escrever o "pular para o final". Todavia, podemos ver os oito ciclos dos controles realizando uma porrada de mudanças no código.

Veja no topo da tela, quando aparece "LOADING GAMES" enquanto isso acontece. E então, aos 1:43, o jogo Pong é carregado. Claro que antes disso foi necessário configurar o acesso à memória, para criar um estouro (buffer overflow) que permita reescrever o código.

A ação escolhida no caso acontece quando o Yoshi come alguma coisa. Eles precisaram fazer disso algo que transbordasse o limite dos sprites, e aí... BOOM... ganha-se acesso ao código.

5994

Com um Pong ou Snake preparado especialmente para este ambiente com antemão, foi só carregar o game.

Se você ficou curioso a respeito de como fazer isso, siga as instruções postadas neste site. Genial, não?

Ajudar a combater o câncer com um projeto geek, estudando desenvolvimento de games e se divertindo entre amigos. Not bad.

Leia mais sobre: , , , , , .

relacionados


Comentários