PAUL GUERRERO software engineer
← retos

Euskal Encounter 34 · Hack It 6

Hack It 6 — Classical Music

Sin resolver
  • #ctf
  • #ia
Buscando en el baúl de los recuerdos me encontré este archivo en un disco duro perdido en el trastero, ¿qué será?
Enunciado del reto

Hasta dónde llegamos

  1. Un audio a π×10⁷ hercios

    Ningún reproductor abre el fichero: el header declara 31.415.926 muestras por segundo, un número que nadie escribe por accidente. El decodificador de referencia lo extrae igual, y la envolvente sale plana. La información va en frecuencia, no en volumen.

  2. La aritmética delata un vídeo PAL

    Las 314.218.750 muestras factorizan en 250×625×2011, y 2011 muestras duran 64,012 µs: la línea de vídeo PAL. Apiladas dan diez segundos de Rick Astley en blanco y negro, con el sincronismo de 4,7 µs de una cinta VHS.

  3. Un rótulo en el frame 125

    Sobre la cara de Rick, hacia el segundo cinco, hay un caption sobreimpreso. Limpiando el rayado línea a línea se lee sin ambigüedad: la contraseña va en tres partes y esa es la primera.

  4. Las otras dos se nos escaparon

    El canal izquierdo del audio HiFi trae un clip de voz de 273 ms en un hueco vaciado a propósito: apunta a la parte 2, pero una voz no dicta ortografía. De la 3 nunca supimos ni dónde estaba.

Contraseña v1nTag3 parte 1 de 3 — el reto sigue abierto

El archivo del baúl son 394 MiB de audio. De música clásica, solo el nombre — y antes de nada, lo honesto: este es el único reto de los trece que no resolvimos. Lo sacaron dos equipos en todo el concurso; nosotros encontramos la primera de sus tres partes y ahí nos quedamos, tras agotar todos los enfoques que se nos ocurrieron.

Lo publicamos igual por dos razones. La primera es que el decode es de los más bonitos de la edición: el fichero no es audio — es una cinta de vídeo VHS entera, sintetizada muestra a muestra, y lo que hay grabado dentro es un rickroll. Te dicen «música clásica», te hacen demodular una señal analógica durante horas, y sale Rick Astley cantando Never Gonna Give You Up. La segunda razón es que este writeup guarda el error más instructivo de la serie: lo cometimos dos veces, la segunda por escrito en la primera versión de este mismo texto, y la sección final cuenta cómo lo cazamos.

De un audio imposible a una cinta de vídeo

classical_music.wv: 394,3 MiB en WavPack, un formato de audio sin pérdidas. ffmpeg lo rechaza de plano («Invalid custom sample rate»), y ahí está la primera pista: el header declara una frecuencia de muestreo de 31.415.926 Hz = π × 10⁷. Nadie muestrea audio a treinta y un megahercios, y nadie escribe π ahí por accidente. El decodificador de referencia del formato, wvunpack, no valida el campo y extrae el WAV sin rechistar. Un valor raro en un header es una pista, no un error.

El WAV no suena a nada, y su envolvente explica por qué: es plana de principio a fin, sin la dinámica de ninguna música. La información no va en la amplitud sino en la frecuencia instantánea — la señal está modulada en frecuencia, como la radio FM. Al demodularla aparece un mensaje suave alrededor de una portadora de ~4,1 MHz.

Y entonces la aritmética lo delata todo. El fichero tiene 314.218.750 muestras, que factorizan exactas:

314.218.750 = 2011 × 625 × 250

A π×10⁷ muestras por segundo, 2011 muestras duran 64,012 µs — la duración de una línea de vídeo PAL (64 µs). 625 son las líneas de un frame PAL. Reordenando el mensaje demodulado en matrices de 2011 × 625 salen 250 frames: diez segundos de vídeo a 25 frames por segundo. En blanco y negro, además: la banda donde una cinta llevaría el color está vacía (el 0,0004% de la energía).

Que sea una cinta no es una metáfora. El pulso de sincronismo de cada línea mide 4,7 µs y el brillo va en FM sobre esa portadora de ~4,1 MHz, que es exactamente cómo graba el VHS PAL. El enunciado lo decía desde el principio —«el baúl de los recuerdos», «el trastero»— y tratar la señal como un formato publicado, en vez de como un invento del autor, fue lo que convirtió las preguntas vagas en preguntas medibles: ¿dónde llevaría el audio un VHS? ¿Y el color? ¿Es una emisión o una grabación?

Un barrido espectral de todo el fichero cierra el inventario: tres portadoras explican el 99,984% de la energía. El vídeo (91,6%) y dos picos afilados en 1,4 y 1,8 MHz (4,2% cada uno), que son el par estéreo del audio HiFi de un VHS PAL. Hay exactamente tres cosas dentro del fichero, y sabemos dónde está cada una.

El rótulo: parte 1 de 3

En el frame 125 (hacia el segundo cinco) hay un caption superpuesto sobre la cara de Rick. Así sale el frame en crudo, tal cual lo escupe el demodulador:

Frame 125 recién demodulado: una cara de frente cubierta por espigas diagonales, con dos franjas oscuras verticales a los lados y una línea de texto tenue cruzando el centro

El frame entero (2011 × 625 muestras), por eso se ve achatado: cada fila es una línea de vídeo completa, con su sincronismo y su borrado a los lados — las dos franjas oscuras verticales. El rayado diagonal es un artefacto que en ese momento no sabíamos explicar (volverá más abajo), y la línea tenue que cruza a media altura es el rótulo.

Limpiando el rayado con un filtro por línea y ampliando la banda central, el texto se lee sin ambigüedad:

La banda del rótulo ya limpia: el texto blanco «Part 1/3: v1nTag3» sobre el fondo oscuro de la cara

«Part 1/3»: la contraseña va en tres trozos. Este —leet de «vintage», muy a juego con la cinta— es el único que sacamos.

Nueve horas para un hallazgo de nueve minutos

Buscando las partes 2 y 3 planteamos la hipótesis correcta —una subportadora de audio— y la buscamos donde el sonido lo lleva una emisión de televisión: 5,9 y 3,14 MHz. Ruido en ambas. Conclusión escrita aquella noche: no hay audio; es un rickroll solo-vídeo.

El fallo no fue la hipótesis. Fue no haber medido nunca dónde estaba la energía del fichero antes de decidir dónde buscar. El barrido espectral de la sección anterior —unos segundos de cómputo— no lo hicimos hasta nueve horas después de dar el audio por inexistente, y enseñó dos portadoras con el 8,4% de toda la energía en 1,4 y 1,8 MHz: dentro había un canal estéreo entero. El hallazgo costó nueve minutos; el marco «aquí no hay audio» costó nueve horas.

Y lo peor no fue lo que ese negativo tapó, sino lo que fabricó. El audio sin detectar se mezcla con el vídeo y deja productos de intermodulación sueltos por el espectro: el rayado diagonal del frame de arriba, un patrón de 175 ciclos por línea. Tratado como señal, ese patrón nos regaló dos falsos positivos que costaron una tarde. Un «teletexto» en la zona de borrado, que un decodificador real (vhs-teletext, con deconvolución) redujo a cero paquetes válidos — y cuya firma definitiva fue estadística: las barras tenían anchuras continuas (1, 2, 3, 4, 5…) cuando un código de verdad las tiene discretas. Y un «autoestereograma» sugerido por un modelo de visión, cuyo mapa de profundidad devolvía, a todas las escalas, el propio vídeo. Los dos decoys eran el mismo audio que habíamos declarado inexistente, visto de refilón. La energía que no has explicado no desaparece: reaparece disfrazada de estructura allí donde mires.

La parte 2: una voz de un cuarto de segundo

Con el audio ya demodulado (con cuidado: los dos canales están a solo 400 kHz uno del otro, y un filtro generoso contamina cada canal con el vecino), la técnica que más rindió fue restar la obra original. Si el material es una grabación de algo conocido, consigues el original, lo alineas y lo restas: lo que sobrevive es lo que añadió el autor. Un filtro de Wiener cancela el 95,7% de la música, y en el residuo queda un único pico: un clip de voz de 273 ms en el canal izquierdo. El autor no lo mezcló con la música: vació el canal durante 640 ms y metió un clip limpio, con silencio alrededor.

Espectrograma de los diez segundos del canal izquierdo del audio HiFi: la música cubre el cuadro entero salvo una franja vertical oscura hacia el segundo cinco, y dentro de ella asoman unos armónicos brillantes por debajo de 1 kHz

El canal izquierdo entero, el 100% del tiempo y sin promediar — el espectrograma que cerró el negativo. La música llena el cuadro de lado a lado menos en esa franja: es el hueco que el autor vació, y lo que brilla dentro son los armónicos bajos de la voz. Promediado sobre los diez segundos, medio segundo de hueco se diluye y no lo ves.

El análisis de formantes —las resonancias que distinguen unas vocales de otras— da un solo núcleo vocálico con F1≈399 Hz y F2≈952 Hz, la caída típica de la /r/ inglesa y una oclusiva sorda al arranque: apunta a «troll». Pero aun aceptando la palabra quedaba el problema de verdad: una voz no dicta ortografía. La parte 1 solo atestigua las sustituciones i→1 y e→3, no dice nada de la o; si la parte 2 se escribía troll, tr0ll u otra variante, nunca lo supimos. Y de la parte 3 —lo decimos tal cual— nunca supimos ni dónde estaba.

Lo que no encontramos, y cómo lo cerramos

Un reto sin resolver deja una obligación que uno resuelto no tiene: decir qué se descartó, con qué criterio y hasta dónde llega cada descarte. Este es el inventario:

  • Teletexto en el borrado vertical — decodificador profesional: cero paquetes válidos; anchuras de barra continuas donde un código real las tiene discretas. Era la intermodulación del audio.
  • Autoestereograma en la textura — el mapa de profundidad reconstruía el propio vídeo a todas las escalas. Mismo origen.
  • Subportadoras de emisión (el sonido de una emisión de TV iría en 5,5–6,5 MHz) — esa banda lleva el 0,0077% de la energía. Es una grabación, no una emisión.
  • Más rótulos en el vídeo — detectores validados inyectando un caption sintético de un solo frame con el contraste real: si el detector no saca el positivo fabricado, su negativo no vale. Tres detectores fallaron esa prueba y hubo que arreglarlos antes de que sus silencios significaran algo. Con los detectores ya válidos: solo existe el rótulo del frame 125.
  • El contenedor, byte a byte — cada sub-bloque de metadata WavPack identificado, incluidos un checksum por bloque y un header WAV canónico con el π×10⁷ y los tamaños exactos. Cero bytes sin explicar: la parte 3 no está en el contenedor.
  • Datos escondidos sobre el audio — el negativo original venía de espectros promediados sobre los diez segundos, donde una ráfaga de 200 ms se diluye hasta volverse invisible. El cierre real fue un espectrograma completo, el 100% del tiempo en cada canal: todo lo que sobresale del suelo quedó identificado, y nada es un payload extra.
  • El propio vídeo como mensaje — los diez segundos de cinta son los diez primeros del videoclip original, alineados frame a frame con offset cero: ahí el autor no eligió nada.

Los dos del espectrograma y el contenedor son parte de los tres agujeros que tapamos en una segunda pasada, días después, releyendo nuestros propios negativos con una sola pregunta: ¿cuáles estaban medidos y cuáles solo declarados? El tercero es el corazón de este writeup.

La primera versión de este texto afirmaba: «el canal derecho está completamente plano». Antes de volver a escribirlo, esta vez hicimos lo que no habíamos hecho con el audio: medir la sensibilidad del instrumento antes de creernos su silencio. Inyectamos en el canal derecho un clip de voz sintético mezclado sobre la música —el caso difícil, no el canal vaciado que sí habíamos encontrado— y fuimos bajando su volumen: a −15 dB el instrumento no lo ve; solo empieza a detectar desde −8 dB. Con ese número en la mano, la frase honesta no es «está plano»: es «no hay nada añadido por encima de −8 dB respecto a la música local». Por debajo de eso nadie ha mirado — y no por ruido del demodulador, que está mucho más abajo, sino porque la cancelación de la música no es perfecta.

Es el mismo error que nos costó el audio HiFi —cerrar como hecho un negativo que ningún experimento había puesto a prueba—, cometido la segunda vez por escrito, en el post-mortem del primero. Cazarlo nosotros mismos y ponerle un número es lo más parecido que hay a cerrarlo bien. La lección cabe en una línea: un negativo sin sensibilidad medida no es un cierre; es una opinión con formato de cierre.

Lo que nos llevamos

Casi todo lo caro de este reto se habría abaratado con un gesto de segundos: mirar dónde está la energía antes de teorizar sobre el contenido. Un presupuesto espectral es leer el índice antes que el libro — aquí decía «hay tres cosas» y lo hicimos tardísimo. Lo segundo, reencuadrar al formato real: «esto es un estándar publicado» te da una lista de sitios concretos donde mirar; «esto se lo ha inventado el autor» no predice nada. Y lo tercero, la disciplina que ya no soltamos: un instrumento solo produce evidencia después de demostrar que ve un positivo conocido, y sus conclusiones llegan exactamente hasta donde llega su sensibilidad, con el número delante.

No sacamos el punto. Pero de los trece niveles de la edición, este es del que más aprendimos.

Solución (solo la parte 1 de 3; las otras dos siguen abiertas):

v1nTag3

El material — los scripts de análisis de señal y el writeup técnico completo, con el inventario de todo lo descartado y su alcance medido, están en euskal34/hack-it/6. El fichero original de 394 MiB no se redistribuye: es del autor del reto.