Challenge SokobanHTB
Este reto consiste en un juego de Sokoban en el que uno de los cubos necesarios para resolver el acertijo se genera fuera del mapa jugable y la solución consiste en utilizar PINCE para el análisis dinámico de memoria, modificar las coordenadas del eje X para teletransportar al jugador fuera de los límites, localizar el cubo, teletransportarlo de vuelta dentro del mapa y resolver el acertijo para obtener la flag.
El reconocimiento inicial comienza ejecutando el juego proporcionado utilizando Wine. Al iniciar el juego, se observa que aunque se requieren tres cubos para resolver el acertijo, solo dos están presentes dentro de los límites del mapa. Esto sugiere que el tercer cubo se genera fuera del área jugable, lo que requiere la manipulación de la memoria para traerlo al mapa.
$ cd out/build/x64-release/SokobanHTB
$ wine SokobanHTB.exe
libEGL warning: pci id for fd 34: 10de:25a0, driver (null)
pci id for fd 35: 10de:25a0, driver (null)
libEGL warning: egl: failed to create dri2 screen
Para localizar las coordenadas del jugador, se realiza un análisis dinámico de la memoria utilizando PINCE. Se ejecuta un escaneo inicial en busca de un valor desconocido de tipo Int32 mientras se está adjunto al proceso SokobanHTB.exe.
0x7ba73000
0x7ba73004
0x7ba73008
0x7ba7300c
...
0x7ba73f9c
Las direcciones de memoria se filtran para localizar la posición del jugador en el eje X. El personaje del jugador se mueve a la derecha para realizar un escaneo de valor incrementado ("Increased"), y luego a la izquierda para un escaneo de valor decrementado ("Decreased"). Este proceso iterativo aísla 14 posibles direcciones de memoria que se correlacionan con el movimiento horizontal.
0x7ffffe20fe10
0x7ffffe20fe24
...
0x7ffffe20fa48
...
0x7ffffe10e1d0
Al congelar las primeras siete direcciones e intentar mover al jugador, se observa que el movimiento no se ve afectado, lo que lleva a descartarlas. El proceso se repite con las direcciones restantes hasta que la congelación de 0x7ffffe20fa48 bloquea el movimiento horizontal, confirmando que es la coordenada del eje X del jugador. El tipo de datos se cambia a Float32 para obtener una representación clara del valor.
Address Type Value
0x7ffffe20fa48 Float32 448.0
Con la dirección de memoria del eje X del jugador identificada, el valor se modifica manualmente a 640.0, teletransportando efectivamente al jugador fuera de los límites del mapa.
Address Type Value
0x7ffffe20fa48 Float32 640.0
Al explorar el área no jugable, se revela el cubo faltante ubicado en la posición 1024 del eje X. Se ejecuta un escaneo de valor exacto ("Exact Value") en PINCE buscando un valor Float32 de 1024.0. Luego, el cubo se empuja una posición hacia la izquierda, y se realiza un escaneo de disminución ("Decreased By") usando 64.0 como parámetro. Esto aísla dos posibles direcciones de memoria para el cubo.
0x7ffffe8522b0
0x7ffffe8522f4
Al congelar la dirección 0x7ffffe8522f4, se evita que el cubo sea empujado, validando que es la dirección de memoria correcta.
Address Type Value
0x7ffffe8522f4 Float32 960.0
Para llevar el cubo al área jugable, su valor en la coordenada del eje X se cambia a 640.0, teletransportándolo dentro del mapa.
Address Type Value
0x7ffffe8522f4 Float32 640.0
El jugador regresa al mapa restableciendo su coordenada a 512.0, asegurando la alineación en el mismo eje Y que el cubo recién ubicado. Ahora los tres cubos son empujados sobre los símbolos designados, completando el acertijo de Sokoban y revelando la flag.
HTB{FLAG}