Fwhibbit CTF 2017 - Mayday Mayday

Published on:
Tags: reversing

Enunciado

Mayday Mayday

Points: 150
Country: South Africa

Attatchment: https://mega.nz/#!HpYxUIIZ!TjDhMDCvazuay1Cats4zObHuRmixGhVa7Sy0-5hnLTg

Description: Hi aspirant, we lost all our carrots, for this reason we need your skills so please... try to steal the private bank of carrots for us. The time begins...NOW!

Solución

La verdad es que no sé para que he publicado este writeup porque es el clásico ejemplo de crackme sencillo y sin mucha sustancia. Pero luego un amigo me ha convencido para ponerlo aunque sea sólo para configurar las opciones del gdb-peda :-)
Para quien no lo sepa, 'peda' es un script de python que te ayuda a no "quemarte tanto las pestañas" en gdb. Te aporta un entorno visual más amigable y funcionalidades extra no incluídas en gdb. Para quien quiera conocer más:
https://github.com/longld/peda
De todas formas yo suelo usar 'voltron', que a diferencia de peda te permite redirigir la salida a otros terminales:
https://github.com/snare/voltron

Estas son las opciones que suelo usar en .gdbinit:

set history save
set confirm off
set verbose off
set print pretty on
set print array off
set print array-indexes on
set python print-stack full
set disassembly-flavor intel
source ~/peda/peda.py

Comencemos por lo básico respecto al binario:

file fwhibbit-150 
fwhibbit-150: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=bd3ef4bb0664dc621aefcbda1f311aee8a832a9e, not stripped

Tenemos un binario que al ejecutarse nos pide una contraseña... Sí, es lo que estáis pensando, lo único que vamos a hacer es poner un breakpoint después de introducir nuestro chorizo correspondiente de AAAA's y ver con que cadena compara la nuestra. Así de sencillo, tendremos la contraseña con tan sólo pasar de hexadecimal a ascii el contenido de memoria.

Lo primero es poner el breakpoint después de introducir nuestra contraseña, para ello buscaremos alguna función tipo scanf:

   0x00000000004008eb <+510>:    lea    rax,[rbp-0x90]
   0x00000000004008f2 <+517>: mov    rsi,rax
   0x00000000004008f5 <+520>: mov    edi,0x400e9d
   0x00000000004008fa <+525>: mov    eax,0x0
=> 0x00000000004008ff <+530>:  call   0x4005f0 <__isoc99_scanf@plt>
   0x0000000000400904 <+535>: lea    rdx,[rbp-0x90]
   0x000000000040090b <+542>: lea    rax,[rbp-0xe0]
   0x0000000000400912 <+549>: mov    rsi,rdx
   0x0000000000400915 <+552>: mov    rdi,rax
=> 0x0000000000400918 <+555>:  call   0x4005d0 <strcmp@plt>
   0x000000000040091d <+560>: test   eax,eax

Bueno, viendo el ensamblador nos saltamos ese breakpoint vamos directamente a lo que nos interesa, la función strcmp:

br *0x0000000000400918

La función strcmp recibe como parámetros el origen (registro $rsi) y el destino (registro $rdi), por lo tanto con mirar esas posciones de memoria tendremos por un lado nuestra entrada en la posición que apunta $rsi y por otro lado la contraseña que está en la posición que apunta $rdi:

x/32xw $rsi
0x7fffffffe0f0: 0x41414141  0x00000000  0xf7de7a44  0x00007fff

x/32xw $rdi
0x7fffffffe0a0: 0x6c6c756e  0x00000000  0xffffe001  0x00007fff

Pasando '0x6c6c756e' a ascii: 'llun' ya tenemos la contraseña. Ahora ejecutamos y nos da la flag:

./fwhibbit-150 
||====================================================================||
||//$//////////////////////////////////////////////////////////////$//||
||(100)================| RESERVE BANK OF FWHIBBIT |==============(100)||
||//$//        ~         '------========--------'                //$//||
||<< /        /$/              // ____ //                         / >>||
||>>|        //L//            // ///..) //              XXXX       |<<||
||<<|        // //           || <||  >}  ||                        |>>||
||>>|         /$/            ||  $$ --/  ||          XXXXXXXXX     |<<||
||<<|     Free to Use        *||  ||_/  //*                        |>>||
||>>|                         *||/___|_//*                         |<<||
||<</      Rating: E     _____/ FWHIBBIT /________    XX XXXXX     />>||
||//$/                 ~|  REPUBLIC OF FWHIBBIT   |~              /$//||
||(100)===================  ONE HUNDRED CARROTS =================(100)||
||//$//////////////////////////////////////////////////////////////$//||
||====================================================================||
Fwhibbit Control Access
Enter our password:
null
You Win
fwhibbit{fwhibbit_reversing_rul3s}

Un reto ideal para lammers como nosotros :-)