Usa el árbol para saltar entre colecciones sin salir del lector.

archivo Seleccionar un writeup Abrir árbol
TaipanBytesChartCTF/WriteupReverseMe.md READ_ONLY

Secret (Reversing)

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 entregaba un binario que validaba la flag. La lógica del programa solo estaba envolviendo una cadena que ya venía guardada dentro del propio archivo.


Reconocimiento

Lo primero fue comprobar qué clase de binario era.

file secret.tb

El resultado mostraba un ELF de 64 bits, enlazado dinámicamente y además not stripped.

Después de eso, se revisó el binario con strings y nm, donde aparecieron varias pistas.

  • Enter flag:
  • Correct! Flag is
  • Wrong flag.
  • TB{reverse_engineering_is_cool}
  • símbolos como main y hex_decode

Con eso, todavía quedaba revisar main para confirmar si había alguna transformación o solo una comparación indirecta.


Análisis

Revisando main, el flujo era más o menos este.

  1. Pedía la entrada del usuario.
  2. Cargaba desde .rodata la cadena TB{reverse_engineering_is_cool}.
  3. Aplicaba XOR 0x42 carácter por carácter.
  4. Convertía ese resultado a hexadecimal.
  5. Lo decodificaba otra vez con hex_decode.
  6. Aplicaba de nuevo XOR 0x42.
  7. Comparaba el resultado final con la entrada.

Al final, toda esa vuelta devolvía exactamente la misma cadena original. El programa no estaba construyendo una flag nueva ni escondiendo un valor que solo apareciera al final. Simplemente tomaba un texto que ya estaba en claro dentro del binario y lo hacía pasar por una secuencia que no cambiaba el resultado.

La constante se podía ver 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

Con eso ya se podía confirmar que la cadena estaba visible dentro del binario.


Resolución

La forma más rápida de resolverlo era leer la cadena con strings. Si se quería comprobar, se podía ejecutar el binario y enviar exactamente esa entrada.

chmod +x secret.tb
echo 'TB{reverse_engineering_is_cool}' | ./secret.tb

El programa respondía con Correct! Flag is TB{reverse_engineering_is_cool}, así que con eso quedaba confirmado el valor correcto.


Flag

TB{reverse_engineering_is_cool}