Analisis de Seguridad Abarrotes

April 20, 2017 | Author: pio777 | Category: N/A
Share Embed Donate


Short Description

Download Analisis de Seguridad Abarrotes...

Description

ATACANDO UN SOFTWARE PROTEGIDO CON WINLICENSE “ABARROTES PDV” FECHA

Septiembre 2010

VICTIMA

Abarrotes PDV versión 1.75

Version descontinuada….. (actualizaron el software después de URL este análisis) DESCARGA PROTECCION Winlicense packer, archivo de licencia .vpv

OBJETIVO

Demostrar como se podria registrar el software sin una licencia valida.

DIFICULTAD

MEDIA

CRACKER

ALEJANDRO TORRES (TORRESCRACK)

Reverse Engineering Solutions.

http://www.facebook.com/yo.torrescrack

www.torrescrack.blogspot.com

Análisis de Seguridad en Software “Abarrotes PDV”

Septiembre 2010 Alejandro Torres Ramírez

Índice

1.2.3.4.-

Especificaciones…………………………4 Introducción………………………………………5 Buscando Vulnerabilidades………6 Posibles Soluciones……………………25

1.- Especificaciones.

Homepage: http://www.abarrotespuntodeventa.com/ Download: * Software: Abarrotes Punto de venta 1.75 Status: VULNERABLE. Proteccion: Winlicense packer, archivo license.vpv Herramientas utilizadas: ollydbg.exe (Debugger-modificado con plugins, protegido de los métodos antidebug), RDG Packer Detector (scanner de protecciones de software) Objetivo: Conseguir registrarse sin una licencia valida

2.- Introducción:

Éste software que veremos a continuación, presenta unos errores bastante comunes en cualquier género de la comunidad de “Seguridad en Software”. Y es que efectivamente, se trata de un fichero compilado en Borland Delphi. Lo que se verá en las siguientes páginas es una vez más producto de (en éste caso) hacer uso de parcheo en memoria usando herramientas que se utilizan para atacar este tipo de protección a lo que facilita el ataque.

3.- Buscando Vulnerabilidades. Nuestro objetivo a seguir es buscar vulnerabilidades que ayuden al pirata informático (cracker) a registrarse sin una licencia valida, utilizando algunas herramientas que se utilizan en este tipo de ataques, por ejemplo: Debuggers, scanners, etc. Que son utilizadas para ayudar a modificar el funcionamiento del programa (en este caso) para poder usarlo sin limitaciones como lo haría una licencia valida. Lo primero que cualquier cracker seria buscar que sistemas de protección utiliza el software, utilizaremos una herramienta creada para buscar posibles packers o protectores de software (themida, winlicense, armadillo, asprotect,upx etc) llamada RDG packer detector. Veamos: EJEMPLO: Como detectaría una aplicacion protegida Winlicense

protección en con Themida

un o

Ahora ya que vimos como el scanner es capaz de detectar protecciones y compiladores, probemos con el software “Abarrotes pdv”

Vemos que no encontró protección alguna ni tampoco el compilador.

Hay 3 opciones de porque no detecto ningún compilador ni protección de el software “Abarrotes PDV”, La primera: es porque el sistema de protección es muy nuevo y el scanner no puede reconocerlo. La segunda: es porque el sistema de protección utiliza un método para burlar este tipo de scanners. La tercera: es porque no utiliza ningún tipo de protección/packer.

Bien ahora, ya vimos que el scanner no nos dio mucha información, entonces pasemos a abrir el debugger “ollydebugger” ( en este caso un debugger modificado para trabajar con los métodos anti-cracking de winlicense) por ejemplo “OLLY SND” y asi investigar mas a fondo.

Al intentar abrir el software con nuestro debugger, nos sale un mensaje, avisándonos que el código esta comprimido o contiene errores en la programación, pero si analizamos, se trata de un software comercial, no puede tener errores graves de este tipo, entonces la única posibilidad que queda, es que este protegido y necesitamos saber con que esta comprimido o que protector usa, bien por ahora tenemos solo esta información: .Utiliza un protector o packer que esquiva los scanners Es suficiente información para nosotros, para así poder descartar varios protectores y enfocarse en los que tienen estos métodos y según mi experiencia los mas comunes que utilizan estos métodos por ejemplo “Winlicense” , “Themida” , crypters nuevos (comúnmente esos son únicamente en malware) descartamos ese , entonces me guiare por mi primer sospecha al correr el software con el debugger buscamos en la memoria del software la string “Winlic” o “Themida” en busca de que protector o packer se trata, veamos esto

Al parecer se trata de el protector “Winlicense” y además vemos unos bytes mas abajo que nos da el nombre de un archivo llamado “licencia.vpv” ya con eso es mas que suficiente para que un pirata con suficientes conocimientos logre penetrar el sistema y validar una licencia invalida, supongo que es una nueva versión de “Winlicense” ya que el scanner no lo detecto. Bien ya tenemos más información: .Utiliza el protector “Winlicense”

.Tenemos el nombre y extensión del archivo que ocupa para saber si es una licencia valida Ahora nos toca correr el software en el debugger y ver de que forma podrían utilizar esa información con un mal uso; el software nos manda a una ventana diciéndonos que no estamos registrados y que ya caduco el tiempo de evaluación.

Bien veamos que la Ventana contiene diferentes opciones y una de ellas es seleccionar la licencia para verificar si es valida o no lo es, y como ya sabemos el nombre y extensión del archivo de licencia, creamos un archivo con ese nombre y extensión con contenido basura.

Vemos que al crear el archivo el archivo toma un icono creado por el software, y eso quiere decir que la extensión es la correcta, ahora lo que sigue es investigar donde compara la licencia valida con la incorrecta para poder hacer un seguimiento y ver donde el pirata informático podría alterar el software y hacer que valide una licencia incorrecta. Seleccionamos la opción de leer el archivo de licencia.

Al parecer el programa valida la licencia solo cuando va a iniciar el programa, reiniciamos el debugger y veamos que nos muestra al volver a iniciar.

Tenemos el mensaje de que la licencia esta corrupta o tiene algún error, habría que capturar quien llama a ese MessageBox para poder encontrar la comprobación, reiniciemos pero cuando aparezca la ventana diciendo de que la licencia esta corrupta ponemos “pause” en el debugger para capturar el messagebox

Al presionar “Pause” nos dirigimos al botón “call stack” encerrado en el rectángulo rojo Vemos 3 llamadas a distintos lugares, pero la ultima siempre es la que nos interesa en estos casos, si hacemos doble click en la ultima llamada nos mandara la dirección al stack (pila), veamos

Si bajamos un poco mas en el stack podremos ver esto

En la dirección 0045ACEB, es donde retorna nuestro programa al presionar el botón “aceptar” del MessageBox, vayamos a esa dirección y pongamos un Break Point (punto

de ruptura) y caeremos hay ,al presionar el botón “aceptar”, veamos

Bien al parecer hemos caído en el Break Point (punto de ruptura), ahora lo que haremos es seguir traceando instrucción por instrucción hasta que lleguemos al lugar donde podamos averiguar quien nos manda a esta rutina donde sale el messagebox, presionaremos F8 para ir traceando (ose a línea por línea) así pasaremos unos 2 minutos traceando hasta que lleguemos aquí:

Al caer aquí solo es cuestión de ver líneas mas arriba un salto muy largo que rebase el lugar donde estamos parados y eso quiere decir que el salto es tomado si la licencia no esta corrupta y no mostrara nunca el messagebox Veamos el salto:

Vemos que es un salto condicional JA significa (Jump if Above), ósea que en este caso toma el salto si el registro eax es mas grande que 7, pongamos un Break Point Hardware on execution para que pare al

ejecutar esa línea, reiniciamos el debugger y esperamos unos segundos a que pare

Vemos que al parar hay, en el registro eax esta el numero 2 y es por eso que el salto condicional no lo toma y hace que nos muestre que la licencia esta corrupta, entonces el salto es tomado si la bandera o Flag “Carry” esta desaactivada y esta bandera se desactiva cuando hace una comparación con un numero y este es mayor del numero al que se le compara, pondré un ejemplo Eax==2;

el contenido de eax es un valor devuelto por una serie de algoritmos que usa el programa para validar la licencia. Cmp eax, 4; compara el registro eax con 4 si eax es mayor a 4 la bandera C “carry” se desactiva Ja registrados; si la bandera “carry” esta desactivada nos manda a estar registrados

Bien ahora que ya entendimos como funciona el salto, entonces debemos de investigar como modificar las banderas en el debugger veamos:

Vemos que debajo de los registros eax,ebx,ecx,edx,esi,edi, nos encontramos con la banderas y en ellas esta la bandera C “Carry” activa y si le hacemos doble click encima de ella se desactiva y vemos que el salto ya se puede tomar veamos:

Ahora al poder tomar el salto corremos nuestro debugger con f9 y ahora vemos esto:

Al parecer logramos burlar comprobación, tomemos nota

la

primera

.La primer dirección donde debemos aplicar el primer parche o modificar en memoria con un loader es la dirección 006C5250 Bien seguimos ponemos los datos correctos ala ventana e intentamos usar el programa haber que otra limitación tenemos:

Vemos que al seleccionar la opción de productos, se da cuenta que el programa ya duro más de 30 días. Bien ya sabemos como burlar el primer salto ahora tendremos que hacer lo mismo de burlar la primera protección y desactivar la bandera “carry” , pero ahora en vez de correr el programa seguimos traceando línea por línea hasta encontrar algo que nos sea sospechoso o alguna comprobación de las fechas que haga que nos muestre ese mensaje:

Traceamos hasta caer aquí

Vemos que luego de pasar el salto JA , dos líneas mas abajo esta esto al parecer hay una llamada y al retornar de ella compara el registro “al” (parte baja de eax, se utiliza para comprar operandos pequeños) con 1 y si la bandera z “Zero” esta desactiva a 0 se toma el salto, la bandera “Zero” se activa a 1 cuando el resultado de una comparación es falso , por ejemplo Eax=4

Ebx=5 Cmp eax, ebx;

al ser el resultado de esta comparación un falso, la bandera Z “zero” se pone a 1 y el salto es tomado.

JNZ salta Bien Ya entendimos como modificar el salto, ahora veremos que hay dentro de la llamada presionando F7 al estar encima de ella y veamos:

Estamos dentro de la llamada, hay que tracear un poco para ver que información compara o de donde la saca, etc, traceamos con f8 hasta llegar aquí:

Vemos que hace una comparación a una dirección de memoria, veamos que compara

Compara que donde esta el byte 0 sea diferente de 0, si es diferente de 0 pasa por donde hay mucho codigo talvez necesita

ser diferente de cero , ahora si recuerdan mas arriba en donde estabamos cuando acababamos de entrar en el call , recordemos

Ya que estemos hay presionemos click derecho y “Find referentes to select command” veamos

Y veremos esto

Vemos que esta pequeña rutina, donde compara la dirección de memoria con 0; es llamada desde 2 distintos lugares, al parecer que es para estar haciendo comprobaciones, pero entonces tenemos que modificar desde esta rutina, para que cuando la llamen siempre piense el programa que en vez de 0 es 1. Modifiquemos algo en memoria solo para probar si esta rutina es parte de la otra protección, encima de la comparación presionemos la barra espaciadora y veremos esto:

Cambiemos un poco el código a lo que veremos a continuación en la imagen de abajo, ya que cambiemos presionamos “ENTER” y después “ESCAPE” listo, ahora corramos y probemos

Y veremos que la protección ha sido vencida y solo modificando unos pocos bytes.

Ahora solo queda crear un loader, para que cuando cargue el programa cambie los bytes en memoria ya que al estar protegido con Winlicense el código se va desencriptando poco a poco y se termina de desencriptar al iniciar el programa dejo a continuación el código del loader , programado en MASM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; include include include include include

windows.inc user32.inc kernel32.inc masm32.inc shell32.inc

includelib includelib includelib includelib

user32.lib kernel32.lib masm32.lib shell32.lib

.DATA Escribir DB " Torrescrack-security ",0 Escribir2 DB "…‰",0

Escribir1 DB "þ@ •",0 Escribir3 DB "ë",0 DirAct DB 150 DUP (?) Buffer DB 150 DUP (?) Nombre DB "\Abarrotes.exe",0 Nombre1 DB "Abarrotes.exe",0 Uno PROCESSENTRY32

.386 .MODEL FLAT,STDCALL OPTION CASEMAP:NONE INCLUDE Loader.inc .CODE Start: INVOKE GetCurrentDirectory,150,ADDR DirAct INVOKE lstrcpy,Addr Buffer,Addr DirAct INVOKE lstrcat,addr DirAct,addr Nombre INVOKE ShellExecute,NULL,NULL,Addr DirAct,NULL,Addr Buffer,SW_SHOWDEFAULT MOV DWORD PTR Uno.dwSize,9999 INVOKE CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,NULL MOV DWORD PTR EBX,EAX INVOKE Process32First,EBX,Addr Uno OTRO: INVOKE Process32Next,EBX,Addr Uno INVOKE lstrcmp,addr Uno.szExeFile,Addr Nombre1 TEST EAX,EAX JZ AKI JMP OTRO

AKI: Invoke OpenProcess,PROCESS_ALL_ACCESS,NULL,Uno.th32Proces sID MOV EBX,EAX Busco: MOV EAX,06C51B8H ; Direccion de comprobación GetModuleHandle Invoke ReadProcessMemory,EBX,EAX,Addr Buffer,4,NULL cmp DWORD PTR [Buffer],458DD08BH ; Suelen ser siempre la misma jne Busco MOV EAX,06C5250H ; Direccion a Desproteger INVOKE VirtualProtectEx,EBX,EAX,4,PAGE_EXECUTE_READWRITE, Addr Buffer MOV EAX,06C5250H ; Direccion a escribir INVOKE WriteProcessMemory,EBX,EAX,Addr Escribir2,4,NULL

MOV EAX,0075CABDH ; Dirección a Desproteger INVOKE VirtualProtectEx,EBX,EAX,4,PAGE_EXECUTE_READWRITE, Addr Buffer MOV EAX,0075CABDH ; Dirección a escribir INVOKE WriteProcessMemory,EBX,EAX,Addr Escribir1,4,NULL

MOV EAX,0075CAC1H ; Dirección a Desproteger INVOKE VirtualProtectEx,EBX,EAX,1,PAGE_EXECUTE_READWRITE, Addr Buffer MOV EAX,0075CAC1H ; Dirección a escribir INVOKE WriteProcessMemory,EBX,EAX,Addr Escribir3,1,NULL

invoke ExitProcess,NULL End Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

A continuación veremos los pequeños errores que causan grandes problemas en la seguridad del software

4.- Posibles soluciones.

El resultado de todo el análisis anterior, es: 1.

Que gracias a los mensajes tipo “MessageBox” logramos capturar las llamadas que hicieron posible romper con la seguridad del software , lo cual se recomienda no aplicar mensajes de ningún tipo al validar la licencia , ya que todo mensaje es manejado por APIS y al enviar los mensajes , solo es cuestión de Buscar la API encargada de mandar cierto

mensaje , ejemplo SetWindowText, MessageBox, etc., y se podría capturar de donde llamaron a la API, 2. Es recomendable sigan usando Winlicense con todas sus funciones anticracking habilitadas (en algunos casos no funciona el software con todas activas , pero prueben) ya que hasta el momento es el mejor sistema anticracking que he conocido, también pueden combinarlo con algún otro tipo de protector, eso complicara muchísimo mas las cosas al cracker , todo esto se suma a las mejoras que les comente en el punto numero uno.

[email protected]

Septiembre 2010 Alejandro Torres Ramírez

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF