Ir al contenido principal

Iniciación a la técnica de ROP

CTF con IDA

Buenas continuando los retos de reversing, ahora nos pasamos a IDA, ya que el siguiente reto se trata de un ejecutable para Windows, y con IDA me siento mas cómodo gracias al curso que hice hace un tiempo del maestro @RicardoNarvaja, el cual recomiendo 100% y que volveré hacer(cuando saque tiempo), para profundizar un poco más.

Bueno yendo al turrón, este reto no lo hemos descargado del mismo enlace del Github de los retos anteriores, así que abrimos nuestra máquina virtual Windows y cargamos el binario con IDA.Seguidamente abrimos la ventana de string (Shift+F12) buscando alguna interesante...

                         

Vemos la string que nos dice que "Your e-mail address is not valid", es la más interesante, por lo tanto nos vamos a esa cadena y vemos la parte de código donde está siendo llamada. Para ello, hacemos doble "click" sobre la cadena y vemos donde está siendo llamada.



Si hacemos doble "click" sobre el texto "DATA XREF: DialogFunc:loc_12D1346↑o" podemos ver la parte del código donde es llamada. Nosotros tras localizar dicha parte de código, solemos colorearla de color rojo, ya que NO QUEREMOS LLEGAR "debugueando".


Seguidamente, subimos hacia arriba y vemos cuando se salta a ese texto que queremos evitar, con la idea de no llegar allí. Llegamos a una parte de código, donde se lee el contenido de una ventana con la función GetDlgItemTextA().


La función GetDlgItemTextA(), de la cual, podemos extraer su funcionamiento e información de los parámetros que están siendo usado haciendo uso de la MSDN de Microsoft. Es una función que se utiliza para devolver el título o el texto asociado de un cuadro de dialogo.

Vemos en la documentación que para poder usar esa función,necesitamos indicarle con el parámetro nIDDlgItem el "handle" del cuadro de dialogo que contiene el texto. Con la herramienta WinDowse podemos de una manera visual, ver el valor del "handle" de cada ventana y así ver a cual ser refiere. (de ahí que en mis comentarios de IDA ya aparezcan)



En la parte de la comprobaciones del correo electrónico introducido el programa comprueba lo siguiente:


  1. Que el correo contenga una "@" , esto lo hace con la función strstr() que según la MSDN nos devuelve un puntero de una cadena de búsqueda, en otra cadena.En otras palabras, mira que exista porque justo debajo hay una comparación y si el puntero esta vacío salta al mensaje de "Your e-mail is not valid"
  2. Comprueba  que el correo introducido tenga un "." a través del método anterior.
  3. Compara que detrás del "."  exista algún carácter, es decir que no sea lo último carácter introducido.
  4. Mira que después del "@" no este el ".

                     

Esos son las comprobaciones que se ven en la imagen superior.

Luego vemos que hay una función que hace saltar al mensaje de error y tras poner un Breakpoint (F2) y ver el contenido de los registros, hemos visto que el programa lee el valor del serial introducido y cuenta el número de caracteres y lo compara con el valor en hexadecimal de 0x10 (16). Vamos, parecido a la función strlen() del ejemplo anterior pero a "manivela".



Vale, ya sabemos que el serial introducido tiene que tener 16 caracteres, si seguimos mas abajo en el grafo de IDA vemos que nos hacen unas cuantas restricciones más ... parecidas al CTF analizado con Radare2 en la entrada anterior.

1ª Comprobación
El primer dígito introducido tiene que ser igual al caracter "C", seguidamente lee el último valor del caracter del serial y la suma en hexadecimal de "C" (0x43) + UltimoCaracter = 0x9B --> UltimoCaracter = 0x9B-0x43 =0x58 -->  "X"



Ya tenemos 2 caracteres del serial.



Serial: C_______________X



2ª Comprobación

Coge el valor del 2 dígito introducido y le resta 0x3, y el resultado tiene que ser 0x57. (por lo tanto nosotros para calcular el serial correcto le sumamos 0x3 a 0x57) --> 0x5A = "Z"

Lo mismo que en la comprobación anterior, la suma del penúltimo número junto con el segundo, tiene que ser igual a 0x9B. Por lo tanto,  0x9B-0x5A --> 0x41--> "A"


                


Ya tenemos 4 caracteres del serial.

Serial: CZ____________AX


3ª Comprobación


Coge el tercer dígito en hexadecimal y le suma 0x1 y tiene que ser igual a 0x3A (por lo tanto, para calcular nuestra entrada tenemos que hacer 0x3A -0x1 = 0x39) --> "9

Al igual que antes, la suma del tercer carácter por el final y por el principio tiene que dar igual a 0x9B.Por lo tanto,  0x9B-0x39 = 0x62 -->"b"


                               


Ya tenemos 6 caracteres del serial.

Serial: CZ9__________bAX

4ª y 5ª Comprobación

La cuarta letra es directamente "d" y la cuarta por el final se obtiene mirando la diferencia entre 0x9b y 0x64 = 0x37 --> "7".

El quinto carácter es "m", y el quinto carácter por el final se calcula 0xC8 -0x81 = 0x47 --> "G".



                              


Serial : CZ9dm______G7baX

6ª, 7ª y 8ª Comprobación:

La sexta letra vemos que se le resta 0x2D y tiene que ser igual a 0x44. Por lo tanto, 0x44 +0x2D = 0x71 --> "q", y el sexto carácter por el final mas la "q" en hexadecimal tiene que ser igual a 0xAA. Por lo tanto, 0xAA-0x71 = 0x39 -->"9".
El séptimo y el octavo carácter es un "4" y una "c" respectivamente, y el séptimo y el octavo por el final es la diferencia de 0x9B- 0x34 ("4") =0x67 -->("g") y 0x9b-0x63= 0x38 --> ("8") respectivamente.

                                       

Por lo tanto el serial final es:

Serial : CZ9dmq4c8g9G7bAX

Y el correo cualquiera que cumpla las condiciones mencionadas anteriormente.

                        


Un saludo

Krilin4

Comentarios

Entradas populares de este blog

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 co…

Iniciación a la técnica de ROP

Buenas a todos,

En esta entrada vamos a resolver el binario propuesto por el maestro con la protección DEP: Que previene de ejecutar el código que introducimos en el stack si se encuentra activada esta protección del binario.
Para ver si un binario tiene la protección DEP(Data execution prevention)activa, podemos mirarlo con la herramienta ProcessExplorer tal y como vamos a ver en el siguiente ejemplo activando la columna DEP del mismo para poder comprobar si el proceso tiene o no el DEP habilitado:
Vemos que al ser un sistema operativo de x64, todos nuestros procesos tiene el DEP habilitado por defecto, y hemos de comprobar también si tiene alguna otra protección nuestro binario como el ASLR(Address Space Layout Randomization), encargado de aleatorizar las direcciones de la memoria virtual cuando nuestro binario es cargado en memoria virtual. Vamos a ver todos los módulos que componen el binario (Programa + librerias(dlls)) para ver si algún módulo no tiene ASLR.
En este caso, el módul…

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…