Ir al contenido principal

Iniciación a la técnica de ROP

Hack the Box Eat the cake!

Buenas de nuevo, retomo esto en un "ratillo" que he sacado para ir dándole un poco de contenido al blog.

Hoy nos ponemos con el resto Eat the cake! de HTB, ya que el otro día me calenté e hice un par de retos para ver lo oxidado que estaba... La verdad que bastante! 😑


El fichero os lo podéis bajar directamente de la página, cuyo SHA256:bd2efc7a1b23885d88d401b2a1fa1d4b307f6efcd76ee0a7d9486f0a8b06e586

Bueno vemos a ponernos manos a las obra, es un ejecutable por lo tanto nos iremos a nuestra máquina Windows que tenemos preparada para este tipo de retos, y abrimos el archivo con el software PEiD para ver si esta empaquetado/ofuscado, pero vamos que ya os digo que sí.

                                     

Vemos que PEiD nos dice que esta empaquetada con UPX 0.89.6 -1.02 / 1.05 - 2.90 --> Markus & Laszlo.
Intentamos desempaquetar la muestra, usando UPX directamente con "upx -d" y tras desempaquetarlo, comprobamos si se  ha hecho de manera correcta, procediendo a su ejecución y esperando a que sea correcta.

                                  


Pero al intentar ejecutarlo, vemos que hay algún problema pues el programa no corre con normalidad (vamos un gatillazo en toda regla) .

                                     

Echamos un vistazo, sobre cual puede ser el motivo de que el programa no funcione tras desempaquetarse.
Algunos ejecutables, vienen por defecto con el ASLR activo al compilarse y al desempaquetar el paquete puede provocar que el programa deje de funcionar correctamente, para solucionar este problema llamamos a la puerta de un referente en esto del reversing y las "free tools" @Didier Stevens y su programa setdllcharacteristics.

Con este programa primero veremos los flags con los que han sido compilado el programa y luego podemos modificar dichos flags fácilmente, en nuestro caso modificaremos el flag dynamic_Base, la cual pondremos a '0' para desactivar el ASLR.

                                      

Vemos que ahora podemos ejecutar el programa sin ningún problema:


Una vez que ya tenemos el programa corriendo, re-nombramos el archivo y lo llamamos cake - copia.exe y lo abrimos con IDA para empezar a investigarlo un poco. Lo primero que hacemos es ver si en las Strings  vemos algo interesante, para ahorrarnos bastante trabajo (y así es).

                                        

Por lo que vemos esa string sera donde queremos llegar, por lo que vamos a ver donde es llamada en el programa, para ello hacemos doble "click" sobre la string y luego pulsamos "x" sobre ella para ver las referencias a la misma.

                                               
y nos encontramos el siguiente fragmento del programa, donde se muestra por pantalla ("printea") dicha string (Donde queremos llegar).

                                           

Por lo que ya nos podemos poner a reversear, para ello vamos a ir yendo hacia atrás en el ciclo de ejecución del programa para identificar en que parte el programa hay comparaciones/saltos/Llamadas_a_funciones que nos parezcan interesantes.

Vemos que si subimos un poco mas arriba podemos localizar donde están los mensajes que nos solicitaban al arrancar el programa que era:  "Please enter a 10-password input (only number and Letters"). Tras ver la función que "printea" el mensaje, vemos que hay un scanf() y lo que hace es coger la la contraseña que introducimos y comparar su longitud con 0xF(15 en decimal) es decir mientras no insertemos una contraseña de tamaño 15, le da igual y avanza la ejecución, sin embargo si el tamaño es 15 nos muestra un mensaje de error y se sale del programa:


Pasamos ahora a la segunda parte, donde se nos pide introducir una contraseña de 15 caracteres:

                                      

Aquí empieza lo interesante, nos vamos a a donde se imprime el segundo mensaje y vemos que tras hacer el scanf() comprueba la longitud con 0xF, y mientras no sea ese valor, se queda en un bucle enganchado pidiendonos la contraseña.

Tras pasarle una entrada de tamaño 15, se llama a la función strncpy() el cual, el software usa para copiar la información que hemos introducido del scanf() en otra posición de la memoria con un tamaño de 400(nos da de sobra).

                                 

En ese strncpy() he puesto un breakpoint para depurar el programa e ir viendo las comprobaciones que se han ido haciendo.
En el binario mostrado, la variable "pass_introducida" es un array([]) que he creado yo de tamaño 15, porque he visto que era donde se guardaba la contraseña que estábamos introduciendo, para ello hemos tenido que re-definir algunas variables que IDA había interpretado de forma distinta (tal y como muestran las siguientes imagenes), para que nos sean mas intuitivas.

Antes:


                                           

Después:






Una vez tenemos definidas correctamente las variables vamos a ver el desensamblado de IDA, mucho mas sencillo, de hecho gran parte de la contraseña que necesitamos introducir la extraeremos a simple vista.


                                 
                                 

Obteniendo directamente de las comprobaciones anteriores : [email protected]_h__arad_$E

 Nos quedan aun por conocer los valores de [pass_introducida + 4], [pass_introducida + 6], [pass_introducida + 7] y [pass_introducida + 0xC].

Para ello "debuggeamos" un poco y nos metemos en una función que he definido previamente como funcion_interesante.
En ella, ponemos un breakpoint al ser llamada y accedemos con un step_into (F7) vemos que el valor del registro ebx="[email protected]$E" que es la contraseña que hemos puesto de prueba de entrada, y que luego comprobaremos que es tambien password requerida:

                           


Posteriormente, re-definimos ebx como pass_introducida para que nos sea mas fácil seguir analizando el código y vemos que ahí se encuentran el resto de caracteres de la contraseña que nos faltaban:




Obteniendo la contraseña: [email protected]$E  y comprobamos que es correcta.



Un saludo peludo!




Comentarios

Entradas populares de este blog

Reversing Write-up Hatred (Bitup19)

Buenas a todos,

Después de un fin de semana intenso peleándome con C++ un poco ( ya veréis el churro de código que he hecho), me he decidido hacer un write-up de como resolví el reto de Hatred, con la compañía de un "figura" de CrackLatinos @bym24v..., bueno sentimentalismos atrás, vamos al turrón!

Comenzamos abriendo el binario y comprobamos que un un binario de x64( por lo tanto, necesitamos ejecutarlo en un SO de x64), seguidamente, vemos que al ejecutarse el binario, se nos cierra automáticamente sin mostrar nada..... (SOSPECHOCHO!)

Lo abrimos con IDA para ver porque se sale y comenzamos a "debuggearlo", lo primero que hacemos es buscar la función main() y re-nombrarla para verlo mas bonito con IDA.



Una vez ya la tenemos localizada, nos metemos dentro de la función, y vemos que nada mas comenzar hace una llamada a IsDebbugerPresent() (esta función nos devuelve eax = 0x1 cuando estamos "debugueando" y eax= 0x0 cuando no). Vemos que independientemente …

WinDBG- Diseño de ShellCodes

Buenas a  todos,

En este pequeño tutorial, voy a intentar explicar y mostrar con ejemplos como crear shellcode tanto en binarios de x86, y posteriormente crearé una entrada para ejemplos en binarios en x64.

Este tutorial esta basado en la parte 6 de los tutoriales  de Ricardo Narvaja de uso de herramientas de exploiting gratuitas y el tutorial de desarrollo de malware de ZeroPad, así que si os gusta las gracias a ellos.

Partimos de una shellcode que vamos a detallar, para explicar como funciona, y los componentes de la misma. Para ello hemos creado un binario donde se ejecuta únicamente esta shellcode para que nos sea mas fácil a la hora de analizarla.

winexec_calc_shellcode =b'\x33\xd2\x52\x68\x63\x61\x6c\x63\x89\xe6\x52\x56\x64\x8b\x72\x30\x8b\x76\x0c\x8b\x76\x0c\xad\x8b\x30\x8b\x7e\x18\x8b\x5f\x3c\x8b\x5c\x1f\x78\x8b\x74\x1f\x20\x01\xfe\x8b\x4c\x1f\x24\x01\xf9\x0f\xb7\x2c\x51\x42\xad\x81\x3c\x07\x57\x69\x6e\x45\x75\xf1\x8b\x74\x1f\x1c\x01\xfe\x03\x3c\xae\xff\xd7'


La shellcod…