Datos del reto
| Campo | Valor |
|---|---|
| CTF | Taipanbyte CTF |
| Reto | Secret (Reversing) |
| Categoría | Reversing |
| Archivo | secret.tb |
| Flag | TB{reverse_engineering_is_cool} |
Descripción del reto
El reto daba un binario que validaba la flag. A simple vista parecía que hacía varias transformaciones antes de comparar la entrada, pero en realidad toda la lógica estaba escondiendo una cadena que ya venía metida en el ejecutable.
Reconocimiento
Lo primero fue revisar qué clase de binario era:
file secret.tb
El resultado mostraba un ELF de 64 bits, dinámicamente enlazado y, sobre todo, not stripped. Eso ya era buena señal porque permitía ver símbolos y orientarse más rápido.
Después, con strings y nm, aparecieron varias pistas bastante directas:
Enter flag:Correct! Flag isWrong flag.TB{reverse_engineering_is_cool}- símbolos como
mainyhex_decode
Solo con eso ya se podía sospechar bastante fuerte cuál era la flag.
Análisis
Al revisar main, el flujo era más o menos este:
- Pide la entrada del usuario.
- Carga desde
.rodatala cadenaTB{reverse_engineering_is_cool}. - Aplica
XOR 0x42carácter por carácter. - Convierte ese resultado a hexadecimal.
- Lo vuelve a decodificar con
hex_decode. - Aplica otra vez
XOR 0x42. - Compara el resultado final con la entrada.
El detalle importante es que esa doble vuelta termina devolviendo exactamente la misma cadena original. O sea: el programa nunca "construye" una flag nueva, solo da rodeos antes de comparar contra un valor que ya estaba en claro en el binario.
La constante se veía directamente en .rodata:
xxd -s 0x5010 -l 48 secret.tb
00005010: 666c 6167 3a20 0000 5442 7b72 6576 6572 flag: ..TB{rever
00005020: 7365 5f65 6e67 696e 6565 7269 6e67 5f69 se_engineering_i
00005030: 735f 636f 6f6c 7d00 2530 3278 0043 6f72 s_cool}.%02x.Cor
Resolución
La forma más rápida de resolverlo era simplemente leer la cadena con strings. Si se quería confirmar, alcanzaba con ejecutar el binario y pasar esa misma entrada:
chmod +x secret.tb
echo 'TB{reverse_engineering_is_cool}' | ./secret.tb
El binario respondía con Correct! Flag is TB{reverse_engineering_is_cool}, así que no hacía falta profundizar mucho más.
Flag
TB{reverse_engineering_is_cool}