---
tags: 'DC506 Challenges'
---
DC506 - Challenge 01
===
Archivo: **challenge.zip**
SHA256: ***71af54066fc9d244a87d0471c4353cc206acce97595ae88c686d08cca194ee9a***
El archivo se encuentra comprimido, por lo tanto iniciamos verificando el tipo de archivo.
```
file challenge.zip
challenge.zip: Zip archive data, at least v2.0 to extract
```
![](https://i.imgur.com/Vtquni5.png)
Ahora utilizamos el programa `John The Ripper` para buscar la contraseña del archivo **challenge.zip**
Primero utilizamos la herramienta `zip2john` que viene en la versión `john-jumbo 1.8`
```
zip2john challenge.zip > hash.txt
ver 14 efh 5455 efh 7875 challenge.zip->HELP PKZIP Encr: 2b chk, TS_chk, cmplen=266, decmplen=355, crc=C8D950DD
ver 14 efh 5455 efh 7875 challenge.zip->dc506.gb PKZIP Encr: 2b chk, TS_chk, cmplen=18218, decmplen=524295, crc=5DCCC4D5
ver 14 efh 5455 efh 7875 challenge.zip->game.map PKZIP Encr: 2b chk, TS_chk, cmplen=3993, decmplen=13373, crc=D57D1C5E
ver 14 efh 5455 efh 7875 challenge.zip->game.sym PKZIP Encr: 2b chk, TS_chk, cmplen=3158, decmplen=9032, crc=11789851
```
Esto nos genera el archivo `hash.txt`
```!
challenge.zip:$pkzip2$3*2*1*0*8*24*d57d*98e5*c6231f99e980cc8f4bbada645abaf0f7e85cdc302044886c82d2b0c143c5c24515084e36*1*0*8*24*5dcc*9988*ffa1fbe771a47dd42d5125c58bd5b9c9b535f9ace557ba70f0250a593cd18f6304bd2b56*2*0*10a*163*c8d950dd*0*3e*8*10a*c8d9*99a7*28f0c1fd87efa7e5aea6aab48271317d1d5541106bc337c98de22d95be2dffae910b1d1f37cef446af6438318b0b8645702af4d6158831dc2c038e0b2b83092d7b0a6b02c450ebf8938701f9ddd744e4b1d5d55a135138909f2366581f7da7fa558a4aef8db542c62beceab613d5bc5bf62d70848b5ca7683536b6001065507c46dd237a00cb85c853bf2b067cb9f76ec9eb0ba1c7e52227285ee038c2e6efa0783a3c5300bfdfa7be5b6ff27a3b49dcc9b18b6cd56330eee00862c954a85a45528623517a78282dac8d5e0f712196385fc1e42ee1b6f6a3902694867460de2a7d95a87c8ece221ed8697269a9bd431a9f35871d1d0baf383df367019c6dcc07e71909b59db72692b83c*$/pkzip2$:::::challenge.zip
```
Posteriormente descargamos el diccionario `rockyou.txt` desde la siguiente página y lo descomprimimos
```
wget https://github.com/praetorian-code/Hob0Rules/raw/master/wordlists/rockyou.txt.gz
gzip -d rockyou.txt.gz
```
Luego usamos el comando `john` para buscar la contraseña con el diccionario
```
john --format=pkzip --wordlist=rockyou.txt hash.txt
Loaded 1 password hash (PKZIP [32/64])
No password hashes left to crack (see FAQ)
```
Luego observamos la contraseña con el siguiente comando
```
john --show hash.txt
challenge.zip:$$jackjack$$:::::challenge.zip
1 password hash cracked, 0 left
```
Ahora descomprimimos el archivo **challenge.zip** con la contraseña recuperada
```
ls -lh
total 1096
-rw-r--r--@ 1 user group 355B Apr 26 19:13 HELP
-rw-r--r--@ 1 user group 512K Apr 26 19:12 dc506.gb
-rw-r--r--@ 1 user group 13K Apr 26 19:07 game.map
-rw-r--r--@ 1 user group 8.8K Apr 26 19:07 game.sym
```
Revisamos los tipos de archivo con el comando `file`
```
file *
HELP: ASCII text
dc506.gb: data
game.map: ASCII text
game.sym: ASCII text
```
Por la extensión de los archivos parece que puede tratarse de un juego de GameBoy y podemos revisar el archivo **HELP**
```
less HELP
Hi!
I was working on my super game to get some $$ and I f*cked up! My friend told
me to run a command on the console and now I can't run my game and don't know
how to fix it... The guy wants me to pay him $50 to fix it! That *sshole!!
Command:
((sed 's@_@a@g'<<<$(echo -n b_st_rd))|tr -d $'\n' && cat game.gb)|tee dc506.gb
Can you help?
tico_espia_69
HELP (END)
```
Parece que si se trata de un juego y el archivo que nos interesa es **`dc506.gb`** y vamos a realizar tres pruebas de concepto para obtener el flag
## PoC #1
Podemos utilizar los comandos **`strings`** y **`grep`** para revisar las cadenas de texto en el archivo **`dc506.gb`**
```
strings dc506.gb | grep flag
flag{gameboy_FTW}
flag.
```
Esa es una forma sencilla de obtener el **`flag{gameboy_FTW}`**, pero como la curiosidad de un hacker va un poco más lejos, queremos ver si el juego realmente funciona
## PoC #2
Podemos crear un script para reparar el juego, por lo que primero realizamos una copia del archivo **`dc506.gb`** con el siguiente comando, por si necesitamos modificarlo posteriormente
```
cp dc506.gb dc506.gb.bak
```
Abrimos nuestro editor favorito y escribimos un par de líneas de código en BASH para reparar el juego. Tomamos el comando del archivo **HELP**, **`(sed 's@_@a@g'<<<$(echo -n b_st_rd))|tr -d $'\n'`** y agregamos un par de comandos para calcular la cantidad de caracteres que contiene la palabra. Luego utilizamos el comando **`dd`** para remover los 7 bytes iniciales del archivo **`dc506.gb`** y creamos un archivo nuevo llamado **`game.gb`**, el cual será nuestro juego reparado
```
#!/bin/bash
FIX=`(sed 's@_@a@g'<<<$(echo -n b_st_rd))|tr -d $'\n'|wc -c|tr -d " "`
dd bs=1 skip=$FIX if=dc506.gb of=game.gb
```
Revisamos de nuevo los archivos
```
file *
HELP: ASCII text
dc506.gb: data
dc506.gb.bak: data
fix_game.sh: Bourne-Again shell script text executable, ASCII text
game.gb: Game Boy ROM image: "GAME" (Rev.01) [MBC1], ROM: 4Mbit, RAM: 128Kbit
game.map: ASCII text
game.sym: ASCII text
```
Ahora descargamos un emulador de GameBoy y cargamos el archivo **`game.gb`**, en nuestro caso usamos **OpenEMU**
![](https://i.imgur.com/NlVpIDC.png)
## PoC #3
Primero realizamos una copia del archivo **`dc506.gb`** con el siguiente comando, por si necesitamos modificarlo posteriormente
```
cp dc506.gb dc506.gb.bak
```
Ahora descargamos un emulador de GameBoy y cargamos el archivo **`dc506.gb`**, en nuestro caso usamos **OpenEMU**
![](https://i.imgur.com/8R24U28.jpg)
Vemos el siguiente error y nos da una idea de que el archivo puede estar dañado
![](https://i.imgur.com/4RrWTM0.png)
Así que lo revisamos con un editor hexadecimal, en nuestro caso vamos a utilizar `iHex`
![](https://i.imgur.com/1I9IYg0.png)
Vemos en la primer línea la palabra **bastard** y recordamos el comando que venía en el archivo **HELP**, que nos indica que hubo una modificación del encabezado del archivo
```
((sed 's@_@a@g'<<<$(echo -n b_st_rd))|tr -d $'\n' && cat game.gb)|tee dc506.gb
```
Pensando que si es un juego de GameBoy, buscamos los detalles técnicos del encabezado de los juegos de GameBoy en los siguientes enlaces
http://gbdev.gg8.se/wiki/articles/The_Cartridge_Header
Podemos observar algo interesante de ese enlace
```!
0100-0103 - Entry Point
After displaying the Nintendo Logo, the built-in boot procedure jumps to this address (100h), which should then jump to the actual main program in the cartridge. Usually this 4 byte area contains a NOP instruction, followed by a JP 0150h instruction. But not always.
0104-0133 - Nintendo Logo
These bytes define the bitmap of the Nintendo logo that is displayed when the gameboy gets turned on. The hexdump of this bitmap is:
CE ED 66 66 CC 0D 00 0B 03 73 00 83 00 0C 00 0D
00 08 11 1F 88 89 00 0E DC CC 6E E6 DD DD D9 99
BB BB 67 63 6E 0E EC CC DD DC 99 9F BB B9 33 3E
```
https://www.gamedev.net/forums/topic/347625-gameboy-rom-file-header--gb-/
Podemos observar algo interesante de ese foro
```!
The Internal Info block begins at $100 and it's format is as follows:
$100-$101 - 00 C3 (2 bytes)
$102-$102 - Lo Hi (Start Address for Game, usually $150 it would be written
as 50 01)
$100-$133 - Nintendo Character Area, if this does not exist the game
will not run!
000100: 00 C3 50 01 CE ED 66 66 CC 0D 00 0B 03 73 00 83
000110: 00 0C 00 0D 00 08 11 1F 88 89 00 0E DC CC 6E E6
000120: DD DD D9 99 BB BB 67 63 6E 0E EC CC DD DC 99 9F
000130: BB B9 33 3E
```
Vemos que de posición **0x100** hasta la **0x133** debe aparecer el logo de Nintendo para que cargue correctamente el juego y en nuestro caso el bitmap **`00 C3 50 01 CE ED 66 66 CC 0D 00 0B 03 73 00 83 00 0C 00 0D 00 08 11 1F 88 89 00 0E DC CC 6E E6 DD DD D9 99 BB BB 67 63 6E 0E EC CC DD DC 99 9F BB B9 33 3E`** inicia en la posición **0x107** dentro del archivo **`dc506.gb`**
![](https://i.imgur.com/LNfbliH.png)
Así que utilizando el editor hexadecimal `iHex` procedemos a realizar la modificación correspondiente en el archivo **`dc506.gb`**. Borramos la palabra **bastard** que equivale en hexadecimal a **`62 61 73 74 61 72 64`** y que se encuentra al inicio, luego hacemos un salto al offset **0x100** para ver si en esa posición inicia con **`00 C3 50 01 CE ED ...`**, quedando de esta forma
![](https://i.imgur.com/f3ohdrz.png)
Salvamos los cambios y probamos en el emulador
![](https://i.imgur.com/NlVpIDC.png)
Jugamos un poco para buscar el flag
![](https://i.imgur.com/Ix3MNpt.png)
Nos indica que el gato tiene el flag
![](https://i.imgur.com/jt32nPT.png)
Finalmente obtenemos el **flag{gameboy_FTW}**
![](https://i.imgur.com/zFoDdeC.png)