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.
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?
.rodata.strings ./challengeCR4CK L4B- 2026 -S3R I4L
CR4CKL4B-2026-S3RI4Lstrings -o ./challenge | grep -E "CR4CK|L4B|S3R"
-o mostra o offset decimal de cada string no arquivo — útil pra localizar exatamente onde patchear se precisar.gdb ./challenge break strcmp run # quando parar no breakpoint: x/s $rdi # sua entrada x/s $rsi # serial correta ← aparece aqui
./challenge Serial de registro: CR4CKL4B-2026-S3RI4L
╔════════════════════════════════════╗ ║ ✓ 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.
| Método | Funciona se serial for dinâmica? | Deixa rastro? |
|---|---|---|
| strings | Não — só vê o que está em .rodata | Nenhum |
| breakpoint no strcmp | Sim — vê a string já montada | Nenhum (análise dinâmica) |
| NOP no strcmp + eax=0 | Sim — qualquer entrada passa | Modifica 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?