Solución ejercicio 26 - Estructuras | Curso IDA Pro


Hoy vamos a resolver el ejercicio propuesto en el tomo numero 26 del curso de IDA Pro que fue planteado aquí

Para comenzar, abrimos y vemos una serie de variables que luego se inicializan en 0, y si vemos las referencias no vuelven a ser usadas, al menos no en la función main.

Vemos que Security_cookie se mueve a eax y posteriormente se guarda en Var_4 luego de ser "xoreada" con ebp, Por lo tanto Var_4 será la flag Security_cookie.


Luego podemos ver algunas llamadas a funciones a las cuales se les pasa como argumento dos variables diferentes "buf" y "var_44" así que probablemente sean dos buffer diferentes.


Si ingreso a cualquiera de esas funciones veo que se realizan operaciones con base al puntero, pero en diferentes puntos, lo que lleva a pensar que se trata de una estructura, o probablemente dos.


En la primera por ejemplo, vemos un printf de el string "please..." y luego un scanf para solicitar un dato en consola y lo guarda en el puntero, que sabemos que es el buffer, "Buff" en la posición 0x10, osea 16 decimal. 

Esto confirma que tendremos que crear dos Structuras antes de continuar para que todo sea mas fácil.


Como vimos al principio, la primera estructura comienza desde Buff que es el puntero de las primeras funciones, hasta seg_cookie que ya la definimos.

Y hacemos lo mismo con la segunda estructura que comienza desde var_44. 

Aquí vemos las dos estructuras, que parecen ser iguales.

Ahora teniendo en cuenta esto continuamos el ejercicio volviendo a la primera función que lo que hace es mostrar el mensaje "Please Enter Your Numer Of Choice:" y luego nos deja poner un numero y no hace nada más, así que podemos llamar a esta función "Numero".

Y gracias a las estructuras sabemos que ese numero se va guardar en Var_14 de la estructura 1.
Así que podemos renombrarlo a nuestro gusto.


Luego la segunda función a la cual también se le pasa como puntero la estructura 1. Vemos que toma el valor de Numero_1 que viene siendo el numero que pusimos antes y compara si es menor o igual a 0x10=16, y luego ese mismo numero lo usa como valor size de gets_s, lo que implica que la consola pedirá otro dato máximo de 16 caracteres y lo copia a p_struc1 que viene siendo el primer buffer de la estructura que sabemos que es de 16bytes entonces no hay problema.

El punto es que la instrucción jle realiza el salto condicional teniendo en cuenta los signos, entonces si ponemos por ejemplo -1 que en hexadecimal es 0xffffffff, va seguir siendo menor que 10, pero cuando vaya a utilizarlo como size, no lo puede tomar negativo así que toma el valor 0xffffffff positivo que es un numero muy grande entonces podríamos hacer overflow y sobreescribir casi lo que queramos.

Esta función la podemos renombrar como quieran, en mi caso pondré "Pide_Dato1".

Hasta este momento solo sabemos que cuando nos pida un numero debemos poner uno negativo y luego un string de mas de 16 bytes para sobreescribir cosas, pero aún no sabemos que queremos sobreescribir.

Vamos a la siguiente función de la cual el puntero sigue siendo el mismo Struct1. Y vemos que compara si var_C es igua a 0x99989796, lo cual no es cierto pues sabemos que al principio se inició en 0 y nunca mas se tocó.

Luego, si se cumple pone en 1 var_8 y sigue procesando. Así que hacemos cuentas para saber cuantos bytes tenemos que poner para pisar var_C, y nos dice que 24.


Así que creamos el string y le agregamos los hexadecimales con los que queremos pisar var_C

Luego si miramos bien, las siguientes funciones son las mismas pero con un puntero diferente, (La otra estructura) por lo tanto volverá a pedir un numero y un string pero el checkeo es otro, 


Vemos entonces que la variable que debemos pisar es var_2C que si calculamos referente a donde comienza struc2 tiene los mismo 24 bytes.

Osea que creamos otro string igual cambiando los últimos hexadecimales y si esto es correcto pone en 1 Flag2, que es otra variable en struct2.

Luego verifica que esas dos flags sean iguales 1 y nos lleva a el mensaje de chico bueno.


Así que solo ejecutamos el binario y ponemos -1 donde pide un numero y luego los dos strings que creamos...




Y todo listo. 

Comentarios

Entradas populares de este blog

Solución Examen 7 | Curso IDA Pro (Ricardo Narvaja)

Solucionario born2root - Vulnhub CTF