Datos del reto
| Campo | Valor |
|---|---|
| CTF | Nullcon CTF 2026 |
| Reto | Flag 3 (Planned-Flags-signed-2.pdf) |
| Categoría | Forense / Misc |
| Flag | ENO{semantic_3_inference_initialized} |
Descripción del reto
El archivo entregado era un PDF con varias flags escondidas y una consigna concreta: había que enviar la que contuviera un 3. El documento parecía redactado, así que el trabajo consistía menos en leer texto visible y más en revisar qué información seguía viva dentro del PDF.
Reconocimiento
Lo primero fue revisar las fuentes más obvias:
pdftotextmostraba flags en otras secciones, pero no la que pedía el reto.- Los metadatos incluían otra cadena con formato de flag, aunque contenía
7y6, no3. - Las anotaciones también revelaban una flag, pero con
2.
Eso dejaba claro que la respuesta no estaba ni en el texto extraíble ni en los metadatos más evidentes.
Análisis
Cuando un PDF está "redactado", muchas veces el contenido original no desaparece del todo. A veces queda convertido en una imagen, desenfocado o superpuesto de forma que no se pueda copiar, pero sigue siendo recuperable al extraer los objetos incrustados.
Por eso el siguiente paso fue sacar todas las imágenes del documento:
mutool extract Planned-Flags-signed-2.pdf
Entre los archivos generados aparecía image-0080.png, que correspondía al bloque redactado de la página 2, justo donde se listaban las flags.
Resolución
Al abrir image-0080.png, aunque el texto estaba borroso, la estructura seguía siendo legible. Se alcanzaba a distinguir una lista del tipo:
- "The first flag is ..."
- "The second flag is ..."
- "The third flag is ENO{semantic_3_inference_initialized}, ..."
Eso resolvía el reto sin demasiada duda: la tercera flag era la única que contenía el carácter 3 dentro de su cuerpo.
Flag
ENO{semantic_3_inference_initialized}