468x60 Ads


lunes, 2 de diciembre de 2013

Reversing Skype (bueno y malo)


Reversing Skype (bueno y malo)

Como se lo prometí a amigo torrescrack hoy publicaré unos de sus excelentes tutoriales: Reversing Skype (bueno y malo).

En este tutorial se probará y pondrá a prueba sus métodos de cifrado y se verá sus tecnicas anti-debug, también sirve para dar un ejemplo  conforme se vaya avanzando, veremos más adelante como se pueden aprovechar este tipo de técnicas y como podrían ser usadas por algunos desarrolladores de malware con el cual se podrían crear imitaciones de programas legítimos infectados con malware.

Analizando:

Empezamos, abrimos nuestro debugger y de primera instacia vemos que no es un Punto de un programa normal y si nos ponemos a ver algunas strings :


De principio, a primera vista me doy cuenta que el software está cifrado, estando en el entrypoint vemos instrucciones abajo, viendo un poco a detalle veremos que usa una rutina para desencriptar gran trozo del código que va a usar, esto es comun para evitar a los desensambladores y dejar al descubierto todo el codigo.


Aquí es muy sencillo explicar esta pequeña rutina:

CPU Disasm

Address   Hex dump          Command                                  Comments

01083DD9    B8 6893D3C2     MOV EAX,C2D39368 ; mueve al registro EAX un hardcoded que usara para la desencriptacion

01083DDE    B9 F0DF0601     MOV ECX,0106DFF0 ; mueve al registro ECX el offset desde donde empezara a desencriptar

01083DE3    8D99 E85D0100   LEA EBX,[ECX+15DE8] ; mueve al registro EBX el offset del entrypoint

01083DE9    8D91 40600100   LEA EDX,[ECX+16040]

LOOP:

01083DEF    3BCB            CMP ECX,EBX

01083DF1    75 03           JNE SHORT 01083DF6   ; desde estas tres instrucciones, compara el registro  ECX que este contiene el offset actual y de ser igual al entry point le suma 28, esto lo hace para no sobre escribir esta rutina

01083DF3    83C1 28         ADD ECX,28

CONTINUA:

01083DF6    3001            XOR BYTE PTR DS:[ECX],AL ; aplica un xor al contenido de ECX para empezar a desencriptar

01083DF8    C1C0 03         ROL EAX,3 ; rotation left 3

01083DFB    41              INC ECX ; incrementa ecx+ 1

01083DFC    3BCA            CMP ECX,EDX

01083DFE  ^ 75 EF           JNE SHORT 01083DEF ; compara si ha llegado al offset 01084030 de no ser asi pasa a la etiqueta loop

Habiendo analizado esto, como vimos al ir des-encriptado y encontrarse con el punto de entrada que es el principio de esta rutina, por lo tanto:



Si hacemos doble click desde el entrypoint podremos ver desde ahí   + 28 que será lo que se saltara y no sobreescribira esa parte asi quesi pongo un BreakPoint desde el  +29 y démosle RUN pra que temrine la rutina y asi termina de des-encriptar los datos , al parecer no es nada del otro mundo de hecho es muy sencillo, continuemos

Adelante podemos ver codigo limpio, pero al parecer este binario se va des-encriptando por fragmentos de codigo que va a utlizar.

Teniendo esta parte clara y para no alargarnos, les resumire, y es que veriamos mas adelante que hace algunos movimientos similares, con algunas rutinas similares a la anterior (con XOR)  desencriptara otro trozo pequeño de codigo que es una parte de la seccion .data unicamente


, pero la parte interesante es que este usa una rutina para crear una nueva tabla IAT (Import Address Table)



Primero obtiene el Handle de la libreria “kernel32.dll” con GetModuleHandle

sintaxis:

HMODULE WINAPI GetModuleHandle(

  _In_opt_  LPCTSTR lpModuleName

);

Despues pasa a sacar el nombre de algunas API’s que usaria mas adelante con GetProcAdress para obtener las direcciones (nueva IAT)

Algunas son:

GetCurrentProcess
ExitProcess
LoadLibrary
VirtualProtect
GetSystemInfo

Esta parte sobre la creacion de una nueva IAT (que es muy comun en malware), pueden apoyarse como ejemplo donde esta igual explicada, en mi analisis de malware en las paginas (17-18)

Encontraremos rutinas muy similares a estas con mucho codigo basura, pero en si, el metodo de cifrado para el codigo que se usa son simples operaciones XOR con algunos hardcoded, ahora bien se podria obtener un binario desempacado, pero seria un trabajo muy largo y tedioso ya que este conforme va ejecutandose tambien elimina algunas partes, esto es un metodo “anti-dump” por si a alguien se le ocurre hacerle un dump cuando esta corriendo en memoria, que en teoría estaria des-encriptado pero sin algunos trozos de codigo y por lo tanto se romperia la ejecucion al intentar correr el dumpeado, estas tecnicas son muy comunes en packers comerciales.

Ahora vayamos a ver y explicar muy rapido algunas de sus tecnicas anti-debug

1: Uso de SoftIce ( que segun recuerdo esta descontinuado)





Este realiza una busqueda de patrones y de cumplirse o encontrarlos muestra el mensaje “Skype is not compatible with system debuggers like SoftICE” , pero como en este caso esoty usando Olly Debugger no ahi problema.

2: IsDebuggerPresent , este es muy comun y a la vez muy sencillo burlar modificando algunos bytes 0,1 y aun asi tambien existen muchos plugins para burlarlo.

Bien pasemos a la parte que quiero probar y supongo para algunos podria ser la mas interesante y es intentar adjuntar codigo o una seccion de codigo y ver si es necesario parrchear chequeos CRC en caso de que este tenga algunos.

Usaremos la herramienta “ToPo”


Seleccionamos nuestro binario llenamos los datos y seleccionamos la casilla “Redirect Entrypoint” , esto no ahorra codigo ya que esto hara que empieze a ejecutar codigo desde nuestro injerto y solo basta con meter nuestro codigo y redirigir al lugar donde deberia iniciar o donde iniciaba antes de nuestro injerto y listo, ahora abrimos el debugger y veamos si funciono



Ahi etamos en el Entry Point y estamos en la nueva seccion, veamos las seciones y veremos que aparece nuestra nueva seccion llamada .topo, tenemos una zona vacia preparada para meter cuanto codigo queramos . 

Si ejecutamos Skype para probar si detecta este algun cambio:


Al parecer no detecto ningun cambio en el tamaño y demas, creo que basta un poco de imaginación como para poder tener un skype 100% funcional con un malware adicional injertado, como mencione anteriomente, y no bastaría mas que meterlo de nuevo al instalador y un poco de ingenieria social,  ubicarlo en un buen sitio en la red y estoy seguro que serian muchas las victimas.

Este escrito podría dar pie a una segunda parte donde se muestren a donde se realizan las conexiones “Login” y que tanto se puede jugar con el codigo de skype y sus conexiones ya que como vimos no es tan complejo ir descrifrando el codigo, por si alguien se anima a colaborar no dude en contactarme o si me queda algo de tiempo intentare trabajar en ello.

Alejandro Torres (TorresCrack)
@Torrescrack248


StuxnetPosted By César Calderón

Amante de todo lo relacionado con la informática, GNU/Linux, Programador, Geek. Las organizaciones gastan millones de dólares en firewalls y dispositivos de seguridad, pero tiran el dinero porque ninguna de estas medidas cubre el eslabón más débil de la cadena de seguridad: la gente que usa y administra los ordenadores.

0 comentarios:

Publicar un comentario