HackDef 2017 Quals Round - Pwning 300

By Egresados_MISTI Team 


Download mistakes here

Description del reto: Analiza el binario adjunto y explota el servicio en web.hackdef.net:5060 para obtener la bandera. 
1. Al revisar las funciones existentes en el binario encontramos una con un nombre interesante: own. Cuando la revisamos vemos que manda llamar a la función system. 




2. El argumento para system está contenido en la variable global string. Si revisamos las referencias a esta variable vemos que es empleada dentro de las funciones main, mistake1, mistake2 y mistake3. 

 
Podemos ignorar cuando se usa dentro de main, ya que solo se inicializa a 0. Al revisar el resto de las funciones vemos que escriben datos en nuestra variable string. Siguiendo el orden mistake1, mistake2 y mistake3 nos damos cuenta que se termina escribiendo la cadena “/bin/cat flag.txt”. Esto nos dice que para poder obtener la bandera debemos de lograr la ejecución de las funciones en el siguiente orden: 

mistake1 --> mistake2 --> mistake3 --> own

Sin embargo no todo es tan simple, ya que cada una de las funciones mistake realiza algunas validaciones de valores de argumentos recibidos para poder llegar a ejecutar el código que inicializa la variable con nuestra cadena deseada. Los valores esperados son: 






 3. Revisando la función vuln (que es llamada desde main) podemos ver que se leen datos desde la entrada estándar y se almacenan en pila, por lo que tenemos una vulnerabilidad de desbordamiento de bufer en pila. Podemos aprovechar esta vulnerabilidad para llevar a cabo un ataque de ROP para encadenar todas las llamadas a función en el orden deseado, mientras que proporcionamos los argumentos correctos a cada una de ellas.

4. El único paso restante para armar toda nuestra cadena ROP es limpiar los argumentos pasados a cada función antes de llamar a la siguiente y que así quede alineada la pila. mistake1 recibe 1 argumento, mientras que mistake2 recibe 2, por lo que debemos de emplear un gadget para incrementar la pila 4 bytes y otro 8 bytes. Dichos gadgets los encontramos en las direcciones 0x080484D0 y 0x080484CF, respectivamente. 

 

5. Finalmente, nuestro exploit queda de la siguiente manera:



Probando localmente:

Corriendo exploit remotamente para obtener flag:









Comments