O PIN está gravado no binário. Você pode lê-lo ou reescrevê-lo. Desta vez você escolhe.
Cofre digital. Três tentativas. PIN desconhecido.
Desta vez não tem função pra patchear. Não tem jump pra inverter.
A senha está gravada em algum lugar dentro do binário.
Duas abordagens: ler a constante, ou reescrevê-la.
cmp $0x1c7b, %eax compara eax com uma constante imediata. Essa constante está embutida nos bytes da instrução — editável direto no arquivo.0x1c7b na memória: 7b 1c 00 00. O objdump já converte pra você na leitura.
Abre o disassembly do main.
Procura uma instrução cmp comparando um registrador com um número.
Esse número é a senha — mas em qual base está exibido?
objdump -d ./challenge | grep "cmp"401235: 3d 7b 1c 00 00 cmp $0x1c7b, %eax ← a constante
0x1c7b para decimal:python3 -c "print(0x1c7b)" # 7291
1234 seja a senha válida.1234 em hex = 0x4d2.d2 04 00 00.
A instrução cmp em 0x401235 tem o encoding:
3d 7b 1c 00 00 → cmp $0x1c7b, %eax
O byte 3d é o opcode do cmp. Os 4 bytes seguintes são a constante em little-endian: 7b 1c 00 00.
Você só vai mexer nesses 4 bytes — em 0x401236.
r2 -w ./challenge s 0x401236 ; pula o opcode 3d, vai direto pra constante wx d2 04 00 00 ; 1234 em little-endian q
printf '\xd2\x04\x00\x00' | dd of=./challenge bs=1 seek=$((0x401236)) conv=notrunc 2>/dev/nullobjdump -d ./challenge | grep "cmp.*%eax" # 401235: cmp $0x4d2, %eax ← 1234 agora é a senha
x86 usa little-endian — byte menos significativo primeiro.
7291 em hex = 0x00001C7B
Na memória e no binário: 7B 1C 00 00
O objdump converte pra você na exibição, mas se você abrir com xxd vai ver os bytes na ordem invertida.
Isso vai importar muito nos próximos desafios — especialmente no #05 com offsets de call.
| variação | onde | o que faz |
|---|---|---|
| mudar tentativas | 0x401274 | Troca 02 por 63 na instrução cmpl. 99 tentativas em vez de 3. |
| ler sem patchear | — | A abordagem mais rápida: descobre a senha, entra normalmente. Zero rastro no binário. |
| brutar | — | 4 dígitos = 10.000 combinações. Script de força bruta em bash. Lento mas funciona. |
Qual das abordagens (ler, patchear, brutar) você usaria se o binário verificasse a integridade de si mesmo antes de rodar?