// 08 iniciante strings / rodata fishing

Serial
Fishing

A resposta já está no binário. Você só precisa saber onde pescar.

Software de registro. Uma serial. Você não tem — mas o binário sim.
Não tem hash. Não tem criptografia. Só um strcmp direto com uma string fixa.
O ELF carrega a resposta consigo o tempo todo.

~/crackmes/08-serial-fishing
$ ./challenge
╔══════════════════════════════════════╗
║ REGISTRO DE SOFTWARE v3.0 ║
╚══════════════════════════════════════╝

Serial de registro: QUALQUER-COISA

✗ Serial inválida.
Dica: a resposta já está no binário.
conceitos
.rodata
Seção de dados somente-leitura no ELF. Strings literais do programa vivem aqui — acessíveis mas não modificáveis em runtime sem patch.
strings(1)
Ferramenta POSIX que extrai sequências de caracteres imprimíveis de qualquer arquivo binário. Primeiro passo em qualquer análise estática.
strcmp em runtime
Interceptar strcmp via breakpoint revela os argumentos em memória — funciona mesmo quando a serial é montada dinamicamente.

Antes de qualquer disassembly, tente a ferramenta mais simples:
strings ./challenge | grep -E "^[A-Z0-9-]{5,}"
O que você vê? Consegue montar a serial com os pedaços?

solução
// passo 01
Abordagem 1 — strings (o caminho direto)
A serial foi dividida em fragmentos no código-fonte pra dificultar um grep ingênuo. Mas os pedaços continuam visíveis individualmente em .rodata.
bash
strings ./challenge
Você vai ver os fragmentos:
output
CR4CK
L4B-
2026
-S3R
I4L
Concatenados na ordem: CR4CKL4B-2026-S3RI4L
// passo 02
Confirma com strings -o (offset no arquivo)
bash
strings -o ./challenge | grep -E "CR4CK|L4B|S3R"
O flag -o mostra o offset decimal de cada string no arquivo — útil pra localizar exatamente onde patchear se precisar.
// passo 03
Abordagem 2 — interceptar strcmp no GDB
Funciona mesmo se a serial for montada em runtime — você vê a string já construída em memória no momento da comparação.
bash
gdb ./challenge
break strcmp
run
# quando parar no breakpoint:
x/s $rdi   # sua entrada
x/s $rsi   # serial correta ← aparece aqui
// passo 04
Registra
bash
./challenge
Serial de registro: CR4CKL4B-2026-S3RI4L
output
  ╔════════════════════════════════════╗
  ║  ✓ SERIAL VÁLIDA                   ║
  ║  Produto registrado com sucesso.   ║
  ║  FLAG{strings_reveal_secrets}      ║
  ╚════════════════════════════════════╝

Por que funciona: Strings literais em C ficam na seção .rodata do ELF — somente leitura, mas nunca cifradas por padrão. O binário divide a serial em fragmentos pra dificultar um grep direto, mas os pedaços continuam legíveis individualmente. Proteção real exigiria XOR, hash ou geração em runtime com dados externos.

alternativas
MétodoFunciona se serial for dinâmica?Deixa rastro?
stringsNão — só vê o que está em .rodataNenhum
breakpoint no strcmpSim — vê a string já montadaNenhum (análise dinâmica)
NOP no strcmp + eax=0Sim — qualquer entrada passaModifica o binário

Se a serial fosse gerada como SHA256(nome_do_usuário) em vez de hardcoded, qual dessas abordagens ainda funcionaria? Qual não funcionaria mais? E se a serial fosse validada por um servidor remoto?