// 04 iniciante constante hardcoded

Patch de
Constante

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.

~/cracklab/04-patch-constante
╔══════════════════════════════════╗
║ COFRE DIGITAL v2.0 ║
╚══════════════════════════════════╝
Senha (3 tentativa(s) restante(s)): 1234
✗ Senha incorreta.
Senha (2 tentativa(s) restante(s)): 0000
✗ Senha incorreta.
Senha (1 tentativa(s) restante(s)): 9999
✗ Cofre bloqueado. Muitas tentativas.
// conceitos necessários
CMP imm32
A instrução cmp $0x1c7b, %eax compara eax com uma constante imediata. Essa constante está embutida nos bytes da instrução — editável direto no arquivo.
little-endian
x86 armazena inteiros com o byte menos significativo primeiro. 0x1c7b na memória: 7b 1c 00 00. O objdump já converte pra você na leitura.
strings
Comando que extrai strings de texto de binários. PINs numéricos não aparecem (são inteiros), mas senhas em ASCII sim. Sempre vale tentar primeiro.

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?

// duas abordagens válidas
abordagem 1
Ler a constante
Encontra o valor no disassembly, converte pra decimal, entra com a senha original. Sem tocar no binário. A mais rápida.
abordagem 2
Trocar a constante
Muda o valor que o binário aceita. A senha vira o que você quiser. Mais técnico, mais didático.
01 — abordagem rápida
Ler a constante
bash
objdump -d ./challenge | grep "cmp"
Você vai encontrar:
asm
401235:  3d 7b 1c 00 00  cmp  $0x1c7b, %eax    ← a constante
Converte 0x1c7b para decimal:
python3
python3 -c "print(0x1c7b)"
# 7291
~/cracklab/04-patch-constante $ ./challenge
Senha (3 tentativa(s) restante(s)): 7291
✓ Cofre aberto. Bem-vindo.
> Conteudo: FLAG{patch_the_constant}
02 — abordagem de patch
Trocar a constante no binário
Queremos que 1234 seja a senha válida.
1234 em hex = 0x4d2.
Em little-endian 4 bytes: 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.

radare2
r2 -w ./challenge
s 0x401236         ; pula o opcode 3d, vai direto pra constante
wx d2 04 00 00     ; 1234 em little-endian
q
bash — com dd
printf '\xd2\x04\x00\x00' | dd of=./challenge bs=1 seek=$((0x401236)) conv=notrunc 2>/dev/null
verificação
objdump -d ./challenge | grep "cmp.*%eax"
# 401235:  cmp  $0x4d2, %eax    ← 1234 agora é a senha
// por que os bytes parecem ao contrário

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ções pra explorar
variaçãoondeo que faz
mudar tentativas0x401274Troca 02 por 63 na instrução cmpl. 99 tentativas em vez de 3.
ler sem patchearA abordagem mais rápida: descobre a senha, entra normalmente. Zero rastro no binário.
brutar4 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?