Ramandi (w0pr) explicó hasta donde habían llegado, con discusión incluida con Ontza 🙂
Es un webassembly de 2.6Mb (compilado a partir de un programa en Go). Al analizarlo han visto que lanza conexiones contra el server de hackit. Han analizado el protocolo viendo que se pueden hacer peticiones GET y POST. Las GET te devuelven un token que puedes usar luego para las POST. Al hacer un GET han visto también que el server establece conexiones contra tu propia máquina, vía UDP. Ahí se han quedado. Si todo va bien, espero que junto con Ontza podamos hostear una versión jugable en ikasten.io.
Gracias a @abeaumont the w0pr por el writeup que publicó en el Discord de la party:
Os cuento brevemente el nivel 3 de hackit. Tenemos una imagen WebP. En la imagen se ve que está sacada de una https://gamewallpapers.com/ donde está en formato JPEG o PNG y convertida a WebP. La imagen tiene diferentes chunks RIFF. Uno de estos chunks es XMP, que son metadatos en formato XML. Mirando estos metadatos y comparándolos con el JPEG original vemos que se han añadido localizaciones. Cogiendo las iniciales de las localizaciones y probando diferentes combinaciones obtenemos «HALSPEAKS» que es la primera pista (referencia a IBM). Otro de los chunks que nos encontramos es un chunk desconocido al final del fichero, en formato RIFF, tal como permite la especificación, con FourCC LCHK, en referencia a LeChuck. Es un bloque de 40 bytes de datos codificados en EBCDIC (de ahí la referencia a IBM) que nos da la siguiente pista: «I conceal using 74 steganography methods». Vamos ahora con el chunk de metadatos Exif: mirando el chunk podemos ver que hay un thumbnail. Lo extraemos y vemos que está en formato JPEG y también tiene a su vez metadatos Exif, incluyendo otro thumbnail JPEG, del mismo tamaño que el anterior. jsteg (74 en ASCII es J, de la segunda pista) sin contraseña sobre este segundo thumbnail nos recupera unos datos, que usamos como clave para recuperar datos del primer thumbnail con la herramienta imgconceal (referencia a conceal de la segunda pista). Estos datos están codificados en base58 y consisten en una imagen PNG con un código Data Matrix. Al escanear la contraseña del nivel.
La locura del Level2 nos llegó a amargar. Aunque cuando la resolvimos nos llevamos una alegría del copón, todo hay que decirlo. Empezamos sin pistas y con una mala espina considerable al ver tantas URLs de YouTube a vídeos con frases de Arnold Schwarzenegger…con timestamps a frases concretas. No teníamos nada claro qué demonios había que hacer. La primera (mala) idea fue ir apuntando la palabra que oíamos en ese segundo exacto. Vimos que las URLs se reducían a 4 vídeos…pero con 189 timestamps.
Como en todos los niveles, en este también tuvimos ayuda de la IA: en concreto Gemini Flash Pro 2.5 tiene soporte de transcripción de audios, con timestamps incluidos. Hace poco publiqué una extensión que hace uso de esta funcionalidad:
Aquí tengo que descubrirme ante el excelente trabajo de Andrea, Servida, Paul, Owen y Urtzi. Esta generación tiene un nivel técnico excelente. Hats off 🎩Consiguieron transcribir TODO lo que se dice en los timestamps de cada vídeo. La pista que publicó Ontza nos hizo ir al detalle.
Y aquí, en este fichero de texto, hay muuuuuchas horas de curro de Servida:
OK. Pero… ¿y ahora qué? Pues ahora estuvimos horas intentando descifrar qué demonios querían decir esas frases. Os ahorraré nuestras locuras, pero llegamos a interpretar esas palabras cogidas de frases de Arnold en segundos exactos de distintos vídeos como declaración de variables, llamadas a funciones… Sí, una locura… Se la explicamos a Ontza e Immobilis que pasaban por los puestos de los jugadores cada X tiempo y literalmente se rieron a carcajada limpia de nuestras locuras. En ese momento no me sentó muy bien, la verdad 🤡pero tras finalizar el level… hasta yo mismo me reía de nuestro intento de interpretar como código esas frases…. Pero no porque no se pudiera, no, sino porque… YA EXISTïA UN FCKNG intérprete para ello. Exacto, lo que oyes, hay un maldito lenguaje de programación esotérico que permite programar en ArnoldC (lenguaje que interpreta frases de Arnold como si fueran programas, con su propio parser de ArnoldC a bytecode Java, que luego podemos ejecutar)
Ejemplo de «Hello world» en ArnoldC:
IT'S SHOWTIME
TALK TO THE HAND "hello world"
YOU HAVE BEEN TERMINATED
Hay gente para todo, amigos.
Hack It 2: To be or not to be (resuelto por 12 equipos).
La PISTA se publicó cuando llevábamos bastante tiempo de HackIt sin que ningún equipo consiguiera superarla: «Arnold es sabio, es importante escuchar lo que dice.»
Os podéis imaginar nuestra cara de panolis cuando nos enteramos de esto 🤡
En fin… Pero esto no acababa aquí, claro. Tuvimos que pasar por otro proceso de convertir las frases que habíamos transcrito a código ArnoldC válido:
como base, decidimos convertir el código ArnoldC a Python.
Aquí, como curiosidad: Gemini Flash Pro 2.5 + Cursor en modo agente encontró que teníamos clonado el repo de Arnold, donde tienen el parser implementado en Scala:
Oh shit… no puede ser… 42? seriously? Pero… no llevaba ayer el sr. Ontza una camiseta bien chula con ese 42 estampado?
Y sí, para los viejos del lugar:
What is the Answer to the Ultimate Question of Life, the Universe, and Everything?
42
«The Hitchhiker’s Guide to the Galaxy» (Douglas Adams)
Addendum
Me gustó el script sed de transformación de URLs+timestamp a frases de Arnold:
Muy old school: rápido, efectivo, sencillo.
Me gustó también la limpieza del script decodificado en pseudo código que se curró Jon de Navarparty.
Kudos to Jon, Mattin, tatai and all the Navarparty crew.
Los HackIt de hoy en día ya no tienen nada que ver con lo que eran antes. No porque hayan cambiado las normas o los niveles, sino por la tan alabada/odiada IA.
HackIt1: Easy and simple to understand. Resuelto por 76 equipos.
Un ejemplo: hacer reversing del level 1 ha sido tan fácil como pasárselo a Claude. 2-3 minutos.
¿Es esto algo malo o bueno? La respuesta, como siempre, sería: depende. Personalmente me encanta poder profundizar en las soluciones. Hacerle preguntas al LLM sobre trozos que no entiendo. Intentar leer y comprender en detalle las respuestas que nos da. Por ejemplo:
«Explain me the original source code and why is it reversible»
También me gusta poder ir rápidamente a los levels que una IA no puede resolver directamente. O pedirle ayuda para empezar: pedirle que te dé ideas de cómo avanzar, pruebas de concepto, ayudas gráficas… Evitar la pereza, el miedo a la hoja en blanco. Creo que la IA ha hecho mucho más agradable el participar en el HackIt.
Aunque es cierto que a veces, siento que mis conocimientos se van oxidando, olvidando, por falta de práctica. ¿Delego demasiado en la IA? Es probable, rápidamente te acostumbras a «pasarle el marrón» a un LLM. Máxime cuando los usas en modo agente, con Cursor, Claude Code o Gemini CLI. Pero me estoy desviando del tema que nos había traído hasta aquí. Vayamos a por el level 2.