KeyGen
- Dificultad: Difícil
- Categoría: Reversing
- Herramientas: (Python, Ghidra)
Descripción
Este programa valida un número de serie con restricciones matemáticas (XOR, suma, rotación de bits). Genera un serial válido.
Desensamblado del código
Al desensamblar el código, vemos una función que hace un XOR.
undefined8 FUN_001010a0(void)
{ int iVar1; char *pcVar2; undefined8 uVar3; size_t sVar4; long lVar5; byte local_148 [32]; byte local_128 [23]; undefined1 local_111; char local_108 [256];
puts("=== KeyGen Challenge ==="); puts("Format: XXXX-XXXX-XXXX-XXXX (hex)"); printf("Enter a valid serial: "); pcVar2 = fgets(local_108,0x100,stdin); uVar3 = 1; if (pcVar2 != (char *)0x0) { sVar4 = strcspn(local_108,"\n"); local_108[sVar4] = '\0'; iVar1 = FUN_00101280(local_108); // Esto aquí nada más verifica que el input tenga el formato correcto if (iVar1 == 0) { puts("Invalid serial."); uVar3 = 0; } else { local_148[0] = 0x3b; local_148[1] = 0x47; local_148[2] = 0x26; local_148[3] = 8; local_148[4] = 0x18; local_148[5] = 0x40; local_148[6] = 10; local_148[7] = 0x14; local_148[8] = 0x40; local_148[9] = 0x1d; local_148[10] = 0x2c; local_148[0xb] = 0x1e; local_148[0xc] = 0x47; local_148[0xd] = 0; local_148[0xe] = 7; local_148[0xf] = 0x40; local_148[0x10] = 1; local_148[0x11] = 0x2c; local_148[0x12] = 0x41; local_148[0x13] = 0x43; local_148[0x14] = 0x41; local_148[0x15] = 0x45; local_148[0x16] = 0xe; lVar5 = 0; do { local_128[lVar5] = local_148[lVar5] ^ 0x73; lVar5 = lVar5 + 1; } while (lVar5 != 0x17); local_111 = 0; printf("Valid serial! Flag: %s\n"); uVar3 = 0; } } return uVar3;}Podría haberlo hecho en Cyberchef, pero esta vez decidí hacerlo en Python.
flag = [ 0x3b, 0x47, 0x26, 0x08, 0x18, 0x40, 0x0a, 0x14, 0x40, 0x1d, 0x2c, 0x1e, 0x47, 0x00, 0x07, 0x40, 0x01, 0x2c, 0x41, 0x43, 0x41, 0x45, 0x0e]
la_real_flag = [chr(ch ^ 0x73) for ch in flag]print("".join(la_real_flag))Flag
H4U{k3yg3n_m4st3r_2026}