Mi primer reversing.


Hola, resulta que hace unos días he estado leyendo un poco sobre reversing estático y me gustaría mostrar lo que voy aprendiendo, para ello haré una pequeña serie de post resolviendo los examenes del curso de Ricardo Narvaja.

Pero hoy comenzaré con un pequeño reto que soltó @AbelJM.

En la serie de post que haré sobre el curso de Ricardo, seré mas detallado intentando mostrar todo lo posible para que todos aprendamos más, pero este reto lo resolveré rápidamente mostando el proceso que seguí.

NOTA: Para mi es un tema totalmente nuevo, así que pido disculpas si digo cosas que no son, es un proceso de aprendizaje que quiero compartir con ustedes.


  


El ejecutable presenta el reto de encontrar un nombre de usuario y serial, e intentaremos conseguir estos datos sin debuggear.

Así que abrí el ejecutable y la primera vista es:


Esta vista no deja ver demasiado, antes de esto miré si el ejecutable estaba empaquetado de algúna manera pero al parecer no lo está.

Luego intenté mirando los strings y aunque encontre algunos como "Entrar" y "Salir", no encontré referencias que me dieran una guía de donde se estaba realizando la comprobación de usuario y serial.



Luego miré las instrucciones y filtre nombres como Auth o autenticacion y encontré algo interesante.:




Segui la función y me llevó a:



Vemos que hay un montón de variables que en principio no sabemos muy bien para que sirven, pero más abajo encontramos:



Vemos que una serie de bytes se están moviendo a ESI, y el ESI+1,ESI+2 nos indica que al parecer se está construyendo un string moviendo byte por byte a ESI.

Si revisamos el valor del string podemos ver que:

Se genera la palabra "soselputoamo" y se mueve a EAX, de allí se llaman algunas funciones y si se cumplen nos dejará avanzar. 

Así que probamos dicha palabra en el serial con cualquier usuario que al parecer no se comprueba, al menos por ahora.








Si seguimos la linea de ejecución y vemos que se mueven un monton de datos a EAX y se guardan en cada variable que vimos anteriormente.



Si vemos detalladamente, Se ve que que se esta enviando el dato que esta en la sección Text de cada una de esas instrucciones, De hecho podemos ver que la diferencia de cada instrucción es una letra que si contruimos una frase se ve: "Genial Lo Lograste...." Osea el mensaje de felicitaciónes y por eso no pudimos verlo como string, dado que se construye luego de que se ejecuta el programa. De la misma manera se genera el mensaje de error y por ello hay tantas variables, porque cada variable se convierte en un byte de estos mensajes.

Si miramos una de estas instrucciones vemos con mas detalle como se compone y donde está el dato Text:

Adicional a esto, vemos algo curioso, antes de ingresar el serial válido el ejecutable mostraba un mensaje de "Usuario no registrado" aunque no pusieramos ningún usuario.



Pero cuando ingresamos el serial mensaje era: "Usuario registrado" y siempre que abro el ejecutable muestra este mensaje, así que hay que suponer que en algún lado guarda el hecho de que ya se logró ingresar el serial.

Así que volvemos a IDA y seguimos revisando.



Se lográ ver que justo despues de mostrar el mensaje de éxito (Al ingresar el serial correcto) Se llama a una función registro.



Aunque aún no entendemos muy bien todas las CALL que se hacen, podemos ver nombres que tienen que ver con registros, y tiene sentido que se guarde en un registro el hecho de que ya hayamos registrado un usuario, pues si lo guardara en memoria ese dato se perdería. 

Mi logíca me lleva a creer que en este punto es donde se comprueba si una X entrada en el registro existe para mostrar el mensaje si el usuario está registrado o no.

Más abajo vemos que hay funciones que al parecer si escribren en el registro, pero que escriben y en cual registro?.  Vemos que antes de escribir a edx se mueve los datos de _str_serial.Text así que vemos que hay allí.





Vemos algunos campos como el registro donde se escribe y probablemente unos campos user y serial que se montarán allí.




Así que provamos nuestra  teoria y vamos a los registros donde nos indica el programa y vemos:



Efectivamente vemos los campos serial y user en el registro indicado. aunque en el campo user no se escribe nada, puede ser algun bug del ejecutable.



Muchas gracias. @Jlcmux

Comentarios

  1. Ofuscación: array concatenate , osea concatena las string como valor individual, la aplicacion es delphi se puede usar IDR, y luego de registrar agrega una rama de regedit llamada engendrito o algo asi, he ahi el nombre del crackme, luego si inicias denuevo aparece "usuario registrado" , eso

    Buen escrito sigue así :)

    Saludos Apuromafo

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

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

Solucionario born2root - Vulnhub CTF