jueves, 3 de mayo de 2018

Desbloqueando un proyecto de WinProLadder (PLC Fatek)

Hola gente como estan?
Bien aquí les traigo como desbloquear un proyecto de WinProLadder protegido por contraseña, este proyecto puede ser un proyecto guardado o estar ya grabado/subido en el PLC, como ya se sabe de marca Fatek.

Bien para empezar se abre el programa, se carga el proyecto o se conecta al plc y se intenta descargar el mismo.


Una vez abierto/descargado, solicitará el password:

Aquí escribimos cualquier numero y le damos ok. 
Veremos el siguiente mensaje (No le damos a Aceptar, y abrimos OllyDbg):

Una vez abierto el Olly, attachamos el proceso, para ello vamos a la opcion File-->attach

Nos aparecerá el dialogo siguiente, donde buscamos en la lista, la instancia al proceso WinProLadder, y la atachamos:

Una vez atachado, el proceso queda pausado en la instruccion siguiente:

Aqui empezamos a darle a Ctrl+F9 hasta llegar al siguiente código:

Analizando el código anterior, llegamos a la conclusión de que esta función es la que muestra el mensaje de error de chequeo, pero no comprueba nada, por ello continuo con Ctrl+F9 para salir de la misma y llegar al siguiente código:

Una vez retornamos, nos encontramos con el código de la imagen anterior, como se puede apreciar yo recuadré tres llamadas a función, que son las que me llamaron la atención, la primera que hace referencia a "TPLCMem", la segunda a "@Controls@TControl@GetText$qqrv", y la tercera que es de la cual nosotros hemos retornado.
Bien por que las he recuadrado se preguntarán, pues porque según mis años de experiencia y mi intuición me dicen que esas dos funciones anteriores a la del mensaje son las que obtienen los datos de chequeo, y las siguientes call son de comprobaciones varias, y como se puede apreciar inmediatamente anterior a la llamada de la que retornamos, hay un pequeño trozo de código con dos saltos un JZ y un JMP como se sabe el JZ es un salto condicional en caso de ser cero y el JMP es un salto incondicional, en el caso de que el pass sea incorrecto la comparación da cero y el JZ se activa llevándonos al mensaje de error de chequeo, caso contrario va por el JMP y nos deja acceder al proyecto para edición.
An fin, prefiero hacerle caso a mi intuición (y no complicar las cosas con tanto análisis), entonces pongo dos BP uno en la primer función y otro en la segunda de las tres que resalté le doy a run al olly, acepto el mensaje de error ingreso nuevamente un pass erróneo y doy aceptar, al instante de darle aceptar el olly quiebra en el primer BP:

Una vez pase la primer call con F8 (recuadrada en la imagen anterior a la izquierda), se puede apreciar en la ventana de abajo a la derecha (Stack o Pila) una pequeña cadena de caracteres numéricos, los cuales también he resaltado con un recuadro rojo.
Sigo depurando hasta pasar el otro BP y ejecutar la segunda función misteriosa:

Al igual que en la función anterior me retorna otra cadena que guarda justo debajo de la anterior (ambas resaltadas en el recuadro rojo de abajo a la derecha), esta segunda cadena me resulta familiar, ya que es el password que he ingresado erróneamente para hacer las pruebas, con lo cual la primer cadena debería ser el password original del proyecto, realizamos la prueba y como era de esperarse, estamos en lo correcto.

Bien hemos logrado nuestro cometido, poder acceder al proyecto, así que aquí concluye este pequeño tutorial.

No duden en consultar ante cualquier duda!

En la medida que tenga tiempo y los recursos, iré realizando mas tutoriales sobre otros sistemas.

Saludos!!!


miércoles, 2 de mayo de 2018

Desbloquear EasyXXX o MFD-Titán protegidos con contraseña.

Hola gente como va?

Bien lo que voy a publicar hoy es una explicacion simple y una serie de fotos que en su momento subí como albun en mi facebook.
En fin, vamos a desbloquear un relé programable de la marca moeller.
En un principio abrimos el EasySoft:

Luego nos vamos a comunicación y nos conectamos al equipo:

Cuando este transfiriendo la programación nos pedirá la contraseña, aquí aparecerá el cuadro de diálogo siguiente. Donde ingresamos un numero cualquiera y le damos a OK.

Nos aparecerá el siguiente mensaje:

Abrimos el olly y attachamos el programa.
Una vez attachado le damos run y luego pausamos, para que nos deje poscicionado justo dentro del cuadro de diálogo... Vamos saliendo de las distntas call's con CTRL + F9, hasta llegar donde se muestra:

Seguimos con F8 hasta llegar al retorno siguiente:

Lo mismo aqui...

Y aquí también...


Una vez que retornamos de aquí, veran el siguiente código:
PUSH ESI
PUSH EDI
MOV EDI, ECX
LEA EAX, DWORD PTR SS:[ESP+10]
MOV ECX, DWORD PTR SS:[ESP+C]
PUSH EAX
PUSH ECX
MOV ECX, EDI
CALL EASYSOFT.004A56E0
MOV ESI, EAX
TEXT ESI, ESI
JE SHORT EASYSOFT.0047DA8B
MOV EAX, DWORD PTR SS:[ESP+10]
MOV EDX, DWORD PTR DS:[EDI]
PUSH EAX
PUSH ESI
MOV ECX, EDI
CALL DWORD PTR DS:[EDX+98]
MOV EAX, ESI
POP EDI
POP ESI

El cual vamos a editar como muestra la imagen siguiente.

Como ven en esta imagen está el codigo editado y se colocaron dos BP, el de arriba no deben colocarlo, solo deben colocar el de abajo.
Una vez colocado ese BP debajo del salto incondicional y editado el código le dan a RUN, y a esperar se ha dicho.
Cabe destacar que las direcciones de memoria de la imagen anterior con respecto a esta difieren ya que las cree en momentos diferentes.
El código modificado es el siguiente:

PUSH ESI ---> guardo en pila ESI
PUSH EDI ---> guardo en pila EDI
MOV EDI, ECX --- muevo ECX a EDI
LEA EAX, DWORD PTR SS:[ESP+10] ---> muevo una direccion de memoria a EAX (se imaginaran que direccion es....)
MOV ECX, DWORD PTR SS:[ESP+C] ---> muevo un valor a ECX
PUSH EAX ---> pongo EAX en la pila
PUSH ECX ---> pongo ECX en la pila
MOV ECX, EDI ---> muevo a ECX el valor de EDI
CALL EASYSOFT.004A56E0 -----> Esta call devuelve el resultado de la comprobación de seriales
MOV ESI, EAX ---> muevo el resultado a ESI
TEXT ESI, ESI ---> Comparo
JE SHORT EASYSOFT.0044B916 ---> Si es cero salta a la instruccion que esta debajo del JMP, lo cual quiere decir que sería el pass correcto.
MOV ECX, EDI ---> si no es correcto restauro el valor de ECX (notese la tercer instrucción MOV EDI, ECX)
POP EDI ---> restauro EDI
POP ESI ---> restauro ESI
INC EBX ---> incremento EBX (password)
MOV DWORD PTR SS:[ESP+8], EBX ---> guardo mi password (vease cuarta instrucción LEA EAX, DWORD PTR SS:[ESP+10])
JMP SHORT EASYSOFT.0044B8F0 ---> salto al inicio
MOV EAX, ESI
POP EDI
POP ESI
RETN 8


Pass encontrado!!!!!!! (lo verán en EBX).

Cabe destacar que puede existir la posibilidad de ver el password original en la llamada a función CALL EASYSOFT.004A56E0, pero en su momento se me ocurrió hacerlo de esa forma, para un futuro tutorial, si es posible, como funciona esa call y donde se encuentra el pass, sin la necesidad de obtenerlo por fuerza bruta.

Esto es todo por el momento.

Cualquier duda, vale consultar jajaja !!!

Saludos gente!!