Buscar en el sitio

Volver a todos los artículos
Crackmes

Reversing: resolviendo un crackme de ejemplo

Análisis estático y dinámico de un binario sencillo para encontrar la contraseña que valida.

En esta página
  1. Primer vistazo
  2. Análisis estático
  3. Obtener la contraseña
  4. Verificación dinámica
  5. Conclusión

El binario de este artículo es ficticio. Usa la estructura para documentar tus propios análisis.

Primer vistazo

Antes de abrir un desensamblador, recogemos información básica del binario:

file crackme
strings -n 6 crackme | head

El programa pide una contraseña y responde Correct! o Wrong password.

Análisis estático

Al abrirlo en Ghidra, la función main lee la entrada y llama a check. El pseudocódigo simplificado es:

int check(char *input) {
    char key[] = { 0x31, 0x26, 0x30, 0x37, 0x00 };
    for (int i = 0; i < 4; i++) {
        if ((input[i] ^ 0x42) != key[i]) return 0;
    }
    return 1;
}

Cada carácter de la entrada se compara con la clave tras aplicarle XOR con 0x42.

Obtener la contraseña

Como XOR es reversible, basta con aplicar la misma operación a la clave:

key = [0x31, 0x26, 0x30, 0x37]
print("".join(chr(b ^ 0x42) for b in key))

Verificación dinámica

Comprobamos el resultado ejecutando el binario o con un breakpoint en check usando GDB para ver el valor de retorno.

Conclusión

Un XOR con una clave fija no protege nada: la clave está dentro del binario y la operación se invierte trivialmente.

Sud0pls
Sud0pls / Sud0pls

Writeups, notas y reversing.