sábado, 20 de diciembre de 2014

Resolviendo los retos de io.smashthestack.org con radare2 [7]

¡Saludos!

    Últimamente estoy sin tiempo (y Aetsu parece que igual) asi que el blog está bastante descuidado. Aun así, cuando tengo un hueco, intento publicar algo ;)


Level 7

   Como siempre que nos dejan el source, le pegamos un vistazo


      El programa necesita de dos argumentos. El primero debe de ser un entero menor de 10 y el segundo es una cadena que se copiará a buf. O sea, que necesitamos primero encontrar un numero menor que diez, pero que al mismo tiempo sea mayor (para poder hacer el overflow -buff[10]-). Y después sobreescribir la variable count para que tenga el valor que nos permita llegar a ejecutar el /bin/bash.


    La primera vez que pasé el reto lo hice más por intuición que por conocimiento de causa. Un número negativo siempre será menor que 10, por lo que se me ocurrió que probablemente algún número negativo muy bajo (entorno al int min) pudiera acabar dando positivo al operar con él. Para probar la teoría hice un sencillo script en perl.






 El número agraciado fue el -2147483628. Una vez que sabemos el primer argumento, ahora sólo necesitamos hacer el overflow. Lo abrimos con r2, "aa", para analizarlo, y "afl" para listar todas las funciones.
Vemos que hay un main en 0x08048414. Desansemblémoslo (pd @ 0x08048414). La comparación la hace entre la cadena que se ve en el código fuente del programa y EBP - 0xC:

 Para hacer el cálculo de cuanta basura hay que meter para poder modificar el valor de count usaremos dos de las herramientas de radare2, ragg2 y rax2. Con la primera crearemos un patrón de 200 caracteres y con la segunda lo convertimos de hex a raw. Una vez que tenemos el patrón, volvemos a lanzar r2 en modo debugger pasandole como argumentos el número que habíamos calculado antes y el patrón generado.

   "dc" para que el programa se ejecute, cuando de el sigsegv, miramos los registros con "dr". Anotamos el valor alojado en EBP, y usamos el comando "woO lo-que-habia-en-ebp" para calcular el tamaño del patrón en ese punto (72).

   Con 72 sobreescribimos EBP, pero si recordamos nuestra variable count estaba alojada en EBP - 0xc (12), es decir, tendríamos que usar 72 - 12 = 60 caracteres, y justo a continuación 0x574f4c46.


./level07  -2147483628 $(perl -e 'print "A" x 60; print "\x46\x4c\x4f\x57";')

Byt3z!


5 0verl0ad Labs: Resolviendo los retos de io.smashthestack.org con radare2 [7] ¡Saludos!     Últimamente estoy sin tiempo (y Aetsu parece que igual) asi que el blog está bastante descuidado. Aun así, cuando tengo un h...

No hay comentarios:

< >