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)
- 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"
- Comprueba que el correo introducido tenga un "." a través del método anterior.
- Compara que detrás del "." exista algún carácter, es decir que no sea lo último carácter introducido.
- 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"
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
Publicar un comentario