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.