Skip to main content
Volver a writeups

Writeup técnico

Secret (Reversing) – Taipanbyte CTF

---

Taipanbyte CTF

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 is
  • Wrong flag.
  • TB{reverse_engineering_is_cool}
  • símbolos como main y hex_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:

  1. Pide la entrada del usuario.
  2. Carga desde .rodata la cadena TB{reverse_engineering_is_cool}.
  3. Aplica XOR 0x42 carácter por carácter.
  4. Convierte ese resultado a hexadecimal.
  5. Lo vuelve a decodificar con hex_decode.
  6. Aplica otra vez XOR 0x42.
  7. 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}