--- 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)