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!!

viernes, 27 de abril de 2018

Desbloqueando proyectos de Indusoft Web Studio

Hola, bueno paso a explicar como obtuve el acceso a las pantallas de un proyecto protegidas por contraseña:
Lo primero que hacemos es lanzar el soft, cargar el proyecto, y attachar el thread al ollydbg, luego de revisar un poco los modulos y sus strings y no encontrar nada en concreto, decidí poner bp en todos los memcopy que utiliza el programa. Una vez puestos los bp, le di a continuar ejecución y empezé a eliminar los bp que iban saltando a medida que iba ejecutando acciones hasta llegar a ingresar la clave y darle aceptar, en este punto quebraron algunos bps y a partir de ahí empezé a depurar paso a paso, llegando a un código donde mostraba lo siguiente:


En la imagen se puede apreciar por un lado el ollydebug con la depuración del proyecto, a la izquierda arriba resalto el bp donde el código pone en el stack del micro el pass que yo ingresé y a la derecha abajo en el primer recuadro, hay dos hashes, como es de suponer un es del password original de la pantalla y el otro hash es de mi password, en el segundo recuadro los datos guardados en el stack que fueron pasados como parámetros a una función que debe de incluir o ser la función en la que estoy parado en el bp, creo que no es necesario explicar que hace con esos parámetros.
Analizando un poco el código deduje que el pass se guarda en el mismo archivo de la pantalla, por ello abrí el archivo con PsPad y buscando encontré lo que aparece en la imagen abajo a la derecha, casualmente encontramos el hash del password original, para no dar tanta vuelta y tener que analizar el código y entender que función utiliza para codificar el pass, probé reemplazar el hash por el mio, guardar el archivo y reabrir el proyecto, como era de esperarse el pass de la pantalla cambio al pass que yo ingresé.
Todo esto fue probado sobre un proyecto generado con una versión relativamente nueva.
En proyectos generados con versiones viejas, el password no se encripta.
Por ejemplo:   



Como se puede apreciar el password (Por cuestiones de seguridad no lo mostraré completo) es ?p?r?h?, siempre se encuentra cercano al offset 06B0 y se puede identificar con la signatura anterior de bytes que empiezan con el titulo de la pantalla y continua con bytes que no cambian.
Ese proyecto fue realizado con la versión 7.1, el proyecto de pruebas fue generado con una versión posterior a esta.
Bien esto es todo.
Espero sirva de ayuda para próximas versiones.
Saludos!!