ee33 / Solve It 3: Universal Language


Solve It 3: Universal Language: Resuelto por 3 equipos

Z+E+R+O \= 0
urefu(jibu) \= 16 (la longitud de la clave es 16)

Bonita prueba que nos ha tenido entretenidos largo tiempo. Especialmente a Owen, que se «pegó» con Ontza para convecerle de que la solución con enteros no existía 🙂

Una gran pista: si buscas la primera ecuación en Google, obtendrás este post en Quora:
https://www.quora.com/How-far-can-you-go-so-that-the-system-z-e-r-o-0-o-n-e-1-t-w-o-2-t-h-r-e-e-3-f-o-u-r-4-f-i-v-e-5-s-i-x-6-etc-has-a-solution-The-letters-in-the-LHS-are-the-unknowns

Así que, lo que buscamos es resolver este sistema de ecuaciones:

Z + E + R + O \= 0
O + N + E \= 1
T + W + O \= 2
T + H + R + E + E \= 3
F + O + U + R \= 4
F + I + V + E \= 5
S + I + X \= 6
S + E + V + E + N \= 7
E + I + G + H + T \= 8
N + I + N + E \= 9
T + E + N \= 10
E + L + E + V + E + N \= 11
T + W + E + L + V + E \= 12
T + H + I + R + T + E + E + N \= 13
F + O + U + R + T + E + E + N \= 14
F + I + F + T + E + E + N \= 15
S + I + X + T + E + E + N \= 16

Aquí la org emitió una pista cuando llevábamos atascados un buen rato:

«PISTA: Begitxo tiene sus años y tiene un 386SX de CPU, tenedlo en cuenta.»

Si pedimos a gpt 4o explicaciones:

«El 386SX, al igual que otros procesadores de la serie 386, no incluye un coprocesador matemático integrado para realizar operaciones en coma flotante. Por lo tanto, las operaciones en coma flotante debían ser manejadas mediante un coprocesador externo, el 80387, o por medio de emulación por software, lo que podía ralentizar las operaciones de este tipo.»

Así que la pista venía a decir que el sistema de ecuaciones tenía que resolverse con enteros. Pero lo curioso es que ese sistema no tiene solución con números enteros. Sí la tiene para números reales. Varias, de hecho.

Aquí una demostración de Owen sobre por qué la solución obligatoriamente debe incluir números reales en alguna de las variables (en N, por ejemplo):


Aquí la org tuvo que reconocer el bug y quitó la pista.

Soooo… una posible solución:
E \= 0
F \= 2.5
G \= 5
H \= -2.5
I \= 0
L \= 4
N \= 4.5
O \= -3.5
R \= 0
S \= 0
T \= 5.5
U \= 5
V \= 2.5
W \= 0
X \= 6
Z \= 3.5

Donde el input habría que ponerlo así:
0 2.5 5 -2.5 0 4 4.5 -3.5 0 0 5.5 5 2.5 0 6 3.5

(orden alfabético de las variables, sólo los valores de la solución)

Bonita prueba.

ee33 / Solve It 2

Born to run es un level que me encantó. Tranquilamente podría haber sido un level de HackIt y no de SolveIt. Nos pasan un fichero level.bin:
http://ikasten.io/images/ee33_level.bin
que a primera vista no nos dice nada:

$ file level.bin
level.bin: data

Pero, como siempre, el comando strings te ayudará:

$ strings level.bin| grep «V» | grep «2»
*Ver S1.20*
UV2C
#V2 x
Xf2V12
xuuvWdVgXueUHFUFWTDT7BB2#»
fUEVE4T4VR4Dd$3$\&DED5%#55BB2#»
+$WVE»XGE$hUV»xdT#xeD#XEF»XV5#wF5″X5D#7E5″722$»
VFV%Fe2#EBT»5%$$E45″T3$$FD
d’d+d/Z’V’R’Z1Z5Z9P1L1H1D1@1\<14\<2?2C4F8H\<H@HCTFWIZL]PRTRXRZ[^[o_ocogokoolrhrdw`wRyFuBu7r4o1l,q(q$q!f
#%$$2TCVdF6EFDddDDC
2V$BbE
XLLRRVV,^#»2\


Solve It 2: Born to Run (resuelto por 25 equipos)

Y si buscamos *Ver S1.20* en Google, cantamos bingo:

Ese string en concreto solo sale en algunas ROM de SNES. Así que estamos hablando de un volcado de un cartucho SNES. Tras unas cuantas vueltas (buscaba un emulador de SNES para macOS) encontré OpenEmu: https://openemu.org/

Cambiamos la extensión de .bin a .smc (por alguna extraña razón OpenEmu no tragaba con level.bin simplemente porque no le gustaba la extensión) y… nos ponemos a jugar al Super Mario Kart 🙂


En Linux podemos usar snes9x

Aquí he de decir que me vicié un poco al juego… pero era por una buena causa! Pensé que si quedaba primero me saldría algún mensaje con la flag. Pero no… quedé primero, pero no hubo flag:

Así que hubo que recurrir a técnicas de HackIt (!). Abriendo la ROM con el editor EpicEdit, ¡sorpresa!:

Addendum
NavarParty usó un plugin de cheating para poder saltarse paredes que les permitió ver la flag mientras jugaban por el level. Brilliant!

ee33 / SolveIt 1

Ajedrez… este ha sido un tema recurrente para mí en esta #ee33


Solve It 1: Entretenimiento Universal, resuelto por 37 equipos.

Nos pasan 7 gifs de posiciones de ajedrez en un tablero. Parece que esconden un mensaje…. Aquí os dejo una descripción de Servida con la solución:


Primera imagen: How about a nice game of chess?

Servida, [25 Jul 2025 at 00:48:02]:
La presencia de las piezas es una variable booleana, y cada fila es un byte, que en ASCII es un mensaje, en orden de arriba a abajo y de las imágenes de la 1 a la 7
Solo he mirado la primera que pone «How «
….
Me ha dado la pista que ninguna primera columna tuviera piezas

https://ikasten.io/images/ee33_01.gif
…
https://ikasten.io/images/ee33_07.gif

ee33: Hackit Level 5

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.

http://ikasten.io/images/ee33_level.wasm


HackIt 5: All you need is love. NO Resuelto.

ee33: Hackit Level 4

Interesante prueba. Más sencilla de lo que pensábamos originalmente. Con bastantes troleos, eso sí.


HackIt Level 4: Noise? Resuelto por 1 equipo

http://ikasten.io/images/ee33_level.opus

Fichero transmitido por modem. Baudios: 1200

$ minimodem –rx –file level.wav 1200 > extracted

$ file extracted
extracted: GIF image data, version 89a, 400 x 200

Primero troleo:

Dentro del gif vemos que hay un par de .ogg

$ strings extracted

Vamos con Cursor+Claude Sonnet 4 en modo agente:

$ strings extracted | grep -i ogg

// buscar OGG file signatures:
$ hexdump -C extracted | grep -i «4f676753»

// obtener offsets
$ grep -abbo «OggS» extracted

39513:OggS
48094:OggS
56231:OggS
64935:OggS
73658:OggS
80921:OggS
89402:OggS
98112:OggS
106822:OggS
115533:OggS
124243:OggS
132529:OggS
141010:OggS
149738:OggS
157693:OggS

Comprobamos primero tamaño de extracted:
$ wc -c extracted
162245 extracted

Y procedemos a extraer los OGG files en las posiciones 2981 y 6451.

$ dd if=extracted of=embedded_file1.ogg bs=1 skip=2981 count=$((6451-2981))

$ dd if=extracted of=embedded_file2.ogg bs=1 skip=6451

$ file embedded_file1.ogg embedded_file2.ogg
embedded_file1.ogg: Ogg data, Opus audio, version 0.1, mono, 48000 Hz (Input Sample Rate)
embedded_file2.ogg: Ogg data, Opus audio, version 0.1, mono, 48000 Hz (Input Sample Rate)
hackit2025/hackit4

Repetimos el proceso con el primer ogg, pero esta vez a 300 baudios:

$ minimodem –rx –file embedded_file1.ogg 300 > file1
### CARRIER 300 @ 1250.0 Hz ###
### NOCARRIER ndata=21 confidence=2.343 ampl=0.984 bps=300.00 (rate perfect) ###

Veamos qué hemos sacado en claro:

$ file file1
file1: ASCII text

$ cat file1
youtu.be/dQw4w9WgXcQ
Adivinad a dónde nos lleva el vídeo…

No se podía saber 🙂

Entender lo que había en el segundo ogg fue más sencillo… al menos para los viejos del lugar como el que escribe estas líneas:

Un bonito dump de una cinta de Spectrum. La convertimos a wav y de wav a tape:

$ ffmpeg -i embedded_file2.ogg spectrum_tape.wav

$ python3 -c «import tzxtools; print(dir(tzxtools))»

$ tzxwav -o spectrum_tape.tzx spectrum_tape.wav

$ pip show tzxtools
Name: tzxtools
Version: 1.9.4
Summary: A tool collection for processing tzx files
Home-page: https://codeberg.org/shred/tzxtools
Author: Richard Körber
Author-email: dev@shredzone.de
License: GPLv3+
Location: /opt/hackit2025/hackit4/venv/lib/python3.11/site-packages
Requires: numpy, pypng, sounddevice
Required-by:

Sólo nos queda lanzar un emulador de Spectrum para macOS (o cualquier otro para otro sistema operativo):

$ open -a Fuse.app ../spectrum_tape.tzx

(accesible desde aquí https://fuse-for-macosx.sourceforge.io/)

Y por fin, llegamos al final del level.