FIFA 07 NDS Exploit
Já faz algum tempo que venho estudando sobre exploits, engenharia reversa e vários assuntos relacionados, então chegou o momento de por em prática tudo que aprendi. A primeira coisa a se fazer é procurar um ótimo alvo, existem outros games da EA que foram exploitados, como Fifa Street e Fifa 08 do Nintendo DS, então eu fui tentar com o Fifa 07, talvez o diferencial entre os dois jogos anteriores seja o tamanho da EEPROM, o save deles são 512KB, enquanto o do Fifa 07 é 64kb, de qualquer forma, foi um ótimo alvo. Antes de explicar o que foi feito, precisamos saber um conceito bem importante, chamado Buffer Overflow, ele tem um ótimo potencial para exploitação, tudo que precisamos é alterar a string para um tamanho maior até da crash na aplicação, com isso, precisamos colocar mais dados até conseguirmos re-escrever o registrador de retorno (no caso do ARM, é o registrador LR).
- Exemplo de Buffer Overflow
Uma forma eficiente de se exploitar é utilizando Save Games, se você salvar o jogo do Fifa 07 do Nintendo DS/DSi e abrir com um editor hexadecimal, você pode observar que a string do seu nome inserido, estará lá, isso já é um ótimo sinal que ele tem chances de ser exploitado, porém existe um problema antes que você pode editar livremente o Save Game, se você colocar vários nomes aleatórios na hora de criar seu save e abrir cada um com editor hexadecimal, você irá ver que existem 2 bytes que sempre mudam, isso quer dizer que temos um checksum que irá se calculado de acordo com as modificações feitas no Save, se você quiser testar, basta mudar seu nome com o editor e tentar entrar no jogo, ele dirá que o save está corrompido, então, como resolver esse problema ?
Existem duas soluções, a primeira que é fazer engenharia reversa para descobrir o algorítimo que realiza isso (que agora é mais fácil, já que existem emuladores e ótimas ferramentas), ou “na unha”, que é, fazendo vários saves, observando o que muda e descobrir a fórmula para gerar a checksum(em particular, eu aconselho utilizar para engenharia reversa IDA Pro e Desmume). Após conseguir gerar a checksum, o próximo passo é conseguir da crash no jogo, basta você inserir um nome grande, que por sinal, no Fifa 07 foi uma string muito grande para conseguir da crash, após o crash, é a parte mais *chata*, precisamos re-escrever o LR com o endereço onde fica localizado nosso código, uma maneira de descobrir isso é utilizando os emuladores e verificar em que região da memória se encontra nosso save, depois só calcular a região + espaço até o nosso código e escrever no save game(lembre-se, editor hexadecimal será seu melhor amigo aqui), dessa forma, assim que o crash ocorrer, o processador irá saltar até a instrução inicial do nosso código e irá iniciar nossa pequena façanha.
Obs: lembre-se que nosso código deve ser escrito em ARM, existe vários exemplos na internet como deixar a tela toda vermelha, ou colocar algum efeito bonitinho, basta compilar e copiar a região de memória com as instruções e colar com o editor hexadecimal na região correta do save game.
No geral, não é uma tarefa fácil, pois leva muito tempo tanto na parte do checksum, como na parte de conseguir sobrescrever o registrador LR, de qualquer forma, é algo ótimo para estudo e bem divertido para quem quer iniciar e aprender sobre Buffer Overflow, Engenharia Reversa. Antes que eu esqueça, é engraçado a EA cometer o mesmo erro em quase todos os jogos dela para Nintendo DS haha, será que tem algo do tipo no 3DS ? :]
Agradecimentos especiais:
* YoshiInAVoid
* gdkchan
* ernilos