Microcorruption - Sydney#
Microcorruption nos dá um depurador e uma senha para desbloquear um dispositivo. Nossa tarefa é encontrar essa senha lendo o código assembly e usando algumas técnicas de engenharia reversa. Cada desafio leva o nome de uma cidade, e cada um é mais difícil que o anterior.
Se você ainda não resolveu o desafio sozinho, recomendo que pare de ler, resolva o desafio e confira minha solução depois. Não estrague o desafio e divirta-se!
Como resolver#
Primeiramente, vamos verificar o que a função main faz:
main:
add #0xff9c, sp
mov #0x44b4 "Enter the password to continue.", r15
call #0x4566 <puts>
mov sp, r15
call #0x4480 <get_password>
mov sp, r15
call #0x448a <check_password>
tst r15
jnz $+0xc <main+0x26>
mov #0x44d4 "Invalid password; try again.", r15
call #0x4566 <puts>
jmp $+0x14 <main+0x38>
mov #0x44f1 "Access Granted!", r15
call #0x4566 <puts>
push #0x7f
call #0x4502 <INT>
incd sp
clr r15
add #0x64, spEm poucos passos, podemos ver que:
- Escreve um texto solicitando a senha.
- pede uma senha
- compara a senha
A função que imprime na tela e a função get_password não têm nada de incomum, então vamos analisar a função check_password com mais detalhes:
check_password:
cmp #0x5b7b, 0x0(r15)
jnz $+0x1c <check_password+0x22>
cmp #0x7477, 0x2(r15)
jnz $+0x14 <check_password+0x22>
cmp #0x703d, 0x4(r15)
jnz $+0xc <check_password+0x22>
mov #0x1, r14
cmp #0x2355, 0x6(r15)
jz $+0x4 <check_password+0x24>
clr r14
mov r14, r15
retParece que ele compara um byte literal (#) com os dados de memória do registro r15. Então, ele faz algo como:
- Verifica se os bytes em (r15 + 0 bytes) são iguais a 0x5b7b
- Verifica se os bytes em (r15 + 2 bytes) são iguais a 0x7477
- Verifica se os bytes em (r15 + 4 bytes) são iguais a 0x703d
- Verifica se os bytes em (r15 + 6 bytes) são iguais a 0x2355
A posição r15 na memória é onde nossa senha está armazenada. Então, em teoria, se inserirmos esses bytes na ordem (5b7b7477703d2355), o cadeado abrirá, certo? Bem, há um problema.
Estamos lendo byte a byte a partir do endereço de memória, o que significa que os bytes devem ser invertidos:
- 0x5b7b torna-se 0x7b5b
- 0x7477 torna-se 0x7774
- 0x703d torna-se 0x3d70
- 0x2355 torna-se 0x5523
Se inserirmos a sequência correta, teremos a resposta final para o nosso desafio.
Answer:Sydney
7b5b77743d705523