PROGRAMA

      

PROTECCION

     

HERRAMIENTAS

cyTOm!c`s Crackme 1

 

PE_Compact

 

Olly Debugger

Plugin OllyDump

PE_Editor

 

 

 

 

 

     NIVEL: Homínido

 

 

 

Nota: Con la intención de que todos entendáis este tema lo mejor posible (y teniendo en cuenta que yo no estoy inventando nada, me viene a la mente la frase que alguien dijo sobre apoyarse en hombros de gigantes) utilizare para Alguno de los capítulos que traten el tema de empaquetados los crackmes utilizados en el curso de Ricardo Narvaja.

 

El motivo es sencillo: si algo no entendéis en mis tutos podréis tirar de los del maestro y comparar y complementar lo que yo explique con lo que esta explicado en su curso sin perderos, pues el crackme y el empaquetado será el mismo y quizás lo que no veáis claro en alguna de mis capturas o explicaciones si lo halléis en alguna de las suyas.

 

Si aun así las direcciones o valores que os aparecen a vosotros difieren de las que veáis en las capturas de estos capítulos intentad seguir los pasos del tuto adaptándolo a lo que veáis en vuestro Olly, pues estos primeros capítulos de empaquetados siguen una rutina del tipo busca esto-haz esto y veras esto, como hice en la parte anterior del curso, además intentare dar pistas claras de como resolver el desempacado del crackme en cada capitulo.

 


 

Comenzar a estudiar los programas empaquetados/protegidos con compresores especiales  que hacen cambios en el ejecutable.

Estos cambios afectan de varias formas al exe y a la hora de intentar analizarlos con Olly nos ponen las cosas muy difíciles.

Comenzaremos este capitulo de toma de contacto, para ello y como he intentado desde el principio del curso lo haré de forma progresiva de menor a mayor dificultad e intentando ser lo mas claro posible pensando en la gente que empieza desde cero.

 

 

 

Empezaremos tomando contacto con un packer/empaquetador facilito para ir viendo alguna de las características de los packers/empaquetadores.

Elegí PE_Compact pues dentro de mi poca experiencia me parece bastante fácil de desempacar.

Veamos algunas diferencias entre el crackme empacado y el mismo crackme desempacado examinándolos con distintos programas para ir orientándonos en el tema.

Seré un poco (o un poco mucho) pesado repitiendo cosas, pero es importante que algunos conceptos os queden claros en este capitulo.

 

El "conceto" es el "conceto"

 

La forma de ir leyendo esta tabla es tipo tebeo, empezaremos por el cuadro de la izquierda y pasaremos al de la derecha, bajamos y empezamos izquierda ...

Las direcciones pueden cambiar según la maquina pero el tener claros los pasos a seguir es lo importante, pues si los seguimos correctamente lograremos el objetivo.

 

Crackme con PE_Compact

 

PE_Editor

 

Vemos al abrirlo en el Pe_editor que el entry point  nos marca la dirección (4)34590

 

 

Sin embargo en el crackme no empacado nos marca la dirección 251D0, ver imagen del cuadro de la derecha

Por tanto una diferencia es que en el crackme empacado el punto de entrada del programa o entry point es distinto del programa original sin empacar.

 

Esto es por que el empacador coloca como entry point del programa la dirección donde empieza a ejecutarse la rutina de desempacado.

 

Por tanto:

este no es el entry point real del programa, sino el entry point que coloca el empaquetador, para desempacar el crackme debemos encontrar el verdadero entry point del crackme, el entry point que tenía antes de empacarlo/comprimirlo: el entry point original.

 

Lo llamaremos OEP (original entry point)

 

Al entry point que coloca el packer lo llamaremos EP (entry point “a secas”)

 

 

Secciones

 

 

Pulsamos en el botón sections y vemos las partes que componen el crackme/exe, vemos el nombre de las secciones y luego 4 apartados

 

 

 

En Section vemos el nombre de las secciones del exe

 

En Virtual Size vemos el tamaño que tendrán las secciones del exe una vez descomprimidas, o sea cuando se esté ejecutando el exe/crackme

 

En Raw Size vemos el tamaño que tienen las secciones  del exe en el disco (en la carpeta del disco duro donde este guardado), antes de ser descomprimido/ejecutado

 

En Virtual Offset vemos la dirección donde comienza el ejecutable descomprimido/ejecutándose en la memoria

 

En Raw Offset la dirección del comienzo del ejecutable en disco antes de ser descomprimido/ejecutado

 

Cuando digo “descomprimido/ejecutado” quiero decir con el programa “funcionando” o corriéndolo en Olly con F9

Cuando digo “antes de ser descomprimido” me refiero al exe que espera en estado “latente” que lo ejecutemos, el exe guardado en una carpeta cualquiera y sobre el que no se ha realizado ninguna acción para ejecutarlo.

 

Me refiero a descompresión en memoria del exe cuando se esta ejecutando, no a desempacar o desempaquetar el exe.

 

Crackme sin PE_Compact

 

PE_Editor

 

Este seria el entry point real del programa (4)251D0

 

 

 

Es el punto de entrada del crackme, es la primera instrucción que se ejecutara en memoria al correr el crackme.

 

Para que lo entendáis mejor es la primer dirección donde para Olly al cargar un programa.

 

En el caso del crackme empaquetado lo que se empezara a ejecutar será el inicio de la rutina descompresora/desempacadora, por eso la dirección del entry point que nos marca es distinta.

Este será al que llamemos OEP para diferenciarlo del entry point del programa empacado, este es el OEP que debemos encontrar en el crackme empacado para poder desproteger el crackme eliminando el packer/compresor dejándolo listo para ser analizado con Olly.

Mas adelante veremos como encontrar el OEP partiendo desde el EP.

En este caso el OEP del programa esta en la dirección 4251D0.

 

 

Secciones

 

 

 

Si nos fijamos vemos que aquí el tamaño de las secciones es diferente al del crackme empaquetado:

 

 

 

 

Virtual Size y Raw Size son del mismo tamaño

Virtual Offset y Raw Offset son del mismo tamaño

 

Como ya dije al principio yo no estoy inventando nada, por eso partiré de esta formula dada por Ricardo en uno de sus tutos.

El nombre del tuto es: descompresión manual con Procdump (la lección mas dura)

 

Dice Ricardo: la información que nos dan estos apartados (VirtSize RawSize VirtOffset RawOffset) nos sirven para saber si el exe esta empacado o no:

 

si Virtual Size es mayor que Raw Size el ejecutable esta empaquetado

 

lo podemos ver claramente si lo comparamos con la imagen de la izquierda

Nos da también 2 formulas que analizaremos mas adelante:

 

Inicio de sección code = Image Base + Virtual Offset

Final de sección code = inicio de sección code + Virtual Size -1

 

Olly debugger

 

Al cargarlo en Olly nos avisa de que el entry point del programa fuera de la sección code

 

 

Después de aceptar este cartel la primera parada de Olly es en la dirección 434590 que según el PE_Editor es el Entry Point del programa , realmente lo es en el programa empaquetado, pero no es el original entry point que tiene el crackme original sin empaquetar,  para poder desempacarlo debemos hallar el original entry point. (OEP)

 

 

Vuelvo a recordar para no liarnos:

 

EP entry point “falso” (colocado por el empacador)

 

OEP entry point “verdadero” (EP real del programa)

 

Tampoco en el crackme empaquetado vemos las strings references en Olly

 

 

Tampoco vemos las APIs del crackme y en eso poco que vemos no podemos colocar BPs

 

 

Sobre el cartel de aviso de Olly acerca del entry point: nos dice que el punto de entrada esta fuera de la sección de código (code) que significa esto ¿?

 

Miremos el crackme empacado en Olly y cuando estamos parados en la primera dirección (EP) abrimos el mapa de memoria con alt+M o view memory

 

Dirección del EP en el crackme empaquetado (434590) vemos en el memory map que esta dirección pertenece a la sección .rsrc por tanto el EP no pertenece a la sección code.

 

 

 

No vemos la dirección concreta (434590) si no los principios de todas las secciones del exe

 

Cuando digo buscarla en memoria me refiero a mirar en que sección esta,, a que grupo pertenece la dirección 434590, me explico:

 

Estamos parados en 434590 por lo tanto estamos dentro de la sección del exe que comprende desde 42F000 hasta 444000 – 1

(menos uno, pues 444000 es el principio de la siguiente sección)

 

La dirección 434590 esta entre las direcciones 42F000 y 444000

 

Por  tanto: no estamos/no aparecemos dentro de la sección code

pues la sección code comienza  en 401000 y termina en 42F000 – 1

(menos uno, pues 42F000 es el principio de la siguiente sección)

 

El EP "falso" esta dentro de la sección .rsrc

Olly debugger

 

Al cargar el crackme original en Olly no nos sale ningún cartel de aviso y vemos el entry point original del programa (OEP) en la primera dirección donde para Olly

 

 

En el crackme sin empaquetar si vemos las strings

 

 

En el original aparecen las APIs y podemos colocar los BPs que necesitemos

 

 

 

 

Con alt+M vemos que el OEP si esta dentro de la sección code

 

 

si miramos en la memoria la dirección del OEP vemos que ahora si esta dentro de la sección code pues vimos que:

 

la sección code abarca desde 401000 hasta 42F000 – 1

 

Ricardo nos dice que en el 90% de los casos el entry point verdadero del programa esta dentro de la sección code

 

A estas alturas no debería decir esto pero son valores hex, por tanto los sumaremos o restaremos como tales.

 

Podemos comprobar la formula que nos da Ricardo en su tuto:

 

Inicio de sección code = Image Base + Virtual Offset

 

Si lo trasladamos a nuestro exe empacado:

 

Inicio de sección code = 400000 + 1000 esto es igual a:

Inicio de sección code -> 401000.

 

Lo cual como hemos podido ver es cierto (no es que yo dude de Ricardo, libreme Dios !!!) como vimos antes al mirar el mapa de memoria con alt+M en el exe empacado la sección code comenzaba en 401000

 

El final de la sección code lo hallaremos así:

 

Final de sección code = inicio de sección code + Virtual Size – 1 (menos uno)

 

Que en este caso seria:

 

Final de la sección code = 401000 + 2E000 = 42F000 y le restamos 1 

Final de la sección code -> 42EFFF

 

Para que nos sirven estas formulas ¿?

 

Para saber donde comienza la sección code y por tanto en la sección o el rango de direcciones donde debemos buscar el OEP e irnos orientando.

 

Como señala Ricardo:

esta formula es para saber el principio y final de la sección code, NO es valido para hallar el OEP, es una pista para saber por donde debemos buscarlo.

 

Esta tabla  intenta ilustrar del modo mas grafico y claro posible algunas de las cosas que diferencian un exe empaquetado del mismo exe sin empaquetar.

Si tenéis alguna duda ya sabéis foro de HackxCrack o leed a los maestros.

 

Sobre los ejecutables (*.exe) tenéis un estudio hecho por nuMIT_or llamado estudio de los PE (portable ejecutable)  y dentro del curso de Ricardo Narvaja hay  tutos de SickTroen  donde se hacen un estudio detallado de los exe (PE) y sus secciones.

 

A continuación pasaremos a la practica desempacando nuestro primer crackme partiendo de los pocos conocimientos que tenemos hasta el momento:

 

Sabemos que el EP del crackme no es el EP real, pues esta empacado con PECompact, Olly parara por primera vez en este EP "falso"

 

Tenemos que partir desde ese EP "falso" para poder encontrar el OEP y desde el (desde la dirección del OEP) seguir unos sencillos pasos para eliminar el packer y dejar el crackme "limpio".

 

Se acabo el rollo, vamos al grano.

 

 

 

Desempacando el crackme

 

Este crackme esta hecho en Delphi, aunque al analizarlo con Peid no nos lo dice pues cuando están empacados solo nos muestra el empacador/packer y su versión.

Carguémoslo en Olly y pasemos el cartel de aviso pulsando SI, paramos en la primera dirección:  434590 el EP del packer que como vimos antes esta fuera de sección code

 

Bajamos pulsando F7 de uno en uno hasta colocarnos encima del primer PUSHAD y luego F7 una sola vez para pasarlo y caer en el call, no por que tengamos que caer en el call sino por que debemos rebasar el primer pushad con F7,  pues al pasar/ejecutar con F7 el PUSHAD todos los valores de los registros se guardan en el Stack.

 

 

 

Una vez rebasado el pushad vamos a la ventana registers y picamos en ESP y hacemos con el botón derecho follow in dump

 

 

 

Miramos en el Stack y vemos los valores de los registros, el primero corresponde a EDI

 

 

Miramos en el Dump y también vemos los valores de los registros pero "escritos al revés" si os fijáis en la parte superior del dump el primero por la izquierda es el valor de EDI al revés de como lo vemos en las ventanas Registers o Stack

 

 

 

Un detalle de las dos ventanas registers y Stack para que veáis como los distintos registros aparecen en las dos ventanas en distinto orden de arriba a abajo en registers y de abajo a arriba en el Stack

 

Registers ->      Stack ->  

 

Sombreamos en el Dump los primeros valores de la izquierda empezando por la parte superior que como veis corresponden a EDI (al revés)

 

 

 

Sobre estos valores sombreados click derecho y ponemos un Breakpoint - Hardware on access – Dword

 

 

 

Corremos el crackme con F9 y Olly para en 0044154F (el BP que acabamos de poner) desde aquí bajamos con F7 poco a poco, llegamos al RETN y F7 una vez mas

 

 

 

Al ejecutar F7 encima del RETN aparecemos aquí:

 

 

 

Un principio de instrucción dentro de la zona code ( recordamos que la zona code en este crackme abarcaba desde 401000 hasta 42F000 - 1 )

 

Si miramos las Strings references del crackme ahora las vemos.

Además ya sabíamos por lo visto en la tabla superior que el OEP del crackme se encontraba en la dirección 4251D0

 

Por tanto: hemos encontrado el OEP  en la dirección  4251D0

 

Estas tres instrucciones:

PUSH EBP

MOV EBP,ESP

ADD ESP,XXX

Son características del comienzo de los programas escritos en Delphi (por lo menos en los pocos que yo he visto con mi poca experiencia)

 

Por ejemplo los crackmes 3 y 4 de Joe Cracker (capítulos anteriores del curso) empiezan así:

 

55            PUSH EBP

8BEC        MOV EBP,ESP

83C4 F0   ADD ESP,-10

 

El crackme de Karpoff que vimos en el curso (escrito en Delphi) comienza así:

 

55             PUSH EBP

8BEC         MOV EBP,ESP

83C4 F4    ADD ESP,-0C

 

Así que cuando busquemos el OEP en un programa escrito en Delphi ya tenemos otra pista importante (esto siempre según mi experiencia) para orientarnos.

 

Continuamos con el crackme, una vez hallado el OEP  parados sobre la dirección de comienzo (004251D0) vamos a plugins y elegimos OllyDump - Dump debugged process  y lo picamos

 

 

 

Aparece esta ventana, fijaros las casillas que están marcadas, a mi me aparecen ya marcadas por defecto creo recordar, sino deberéis marcarlo como veis en la imagen

 

 

 

Pulsamos   con lo cual le decimos a OllyDump que nos cambie el EP del packer por el que nosotros encontramos: el OEP original, bueno o como  queráis llamarlo

 

Seguidamente pulsaremos    y OllyDump nos volcara una "imagen" del crackme con el EP cambiado por el OEP que a nosotros nos interesa, nos creara un exe que comenzara en el entry point real del crackme, nos librara de caer en el EP de la rutina compresora/empacadora.

 

Podéis ver que pone 34590  -> Modify: 251D0

 

Lo guardamos con un nombre (dumpy.exe en mi caso) y ya tenemos el crackme libre de empaquetado listo para analizar con Olly.

 

Para saber si lo hicimos bien ejecutamos el dumpy.exe para ver si el crackme se ejecuta normalmente, también lo podemos cargar en Olly y ver si aparecen las APIS y podemos ver las Strings.

 

Primer packer vencido, ahora podemos dedicarnos a buscar el serial o el objetivo que nos proponga el crackme como lo haríamos con otro crackme cualquiera, analizando por supuesto el crackme dumpeado/volcado con OllyDump, en este caso de dumpy.exe como yo lo llamé.

 

Apuntes varios y resumen de lo visto donde entenderéis todo de manera mas clara y sin tanto rollo, o como desempacar PE_Compact en 10 pasos:

 

1 para poder desempacar el crackme debemos encontrar primero el OEP, el punto de entrada original del programa.

 

2 para ello cargamos el crackme en Olly y lo corremos con F9

 

3 caemos en el EP puesto por el empaquetador en este caso 434590

 

4 desde este punto bajamos con F7 hasta pasar el primer pushad

 

5 click en ESP y hacemos un Follow in dump de ESP, miraremos en el Stack y veremos cual es el primer valor almacenado, (en este caso 445C3A43 que corresponde al valor de EDI) lo buscamos en el dump escrito al revés de como lo vemos en registers y en la ventana del Stack

 

6 sombrearemos primer valor de la dirección 12FFA0 (en este caso es la que vemos en ESP) empezando por la parte superior izquierda en el dump y pondremos un BP - Hardware on acess - Dword

 

7 corremos el crackme con F9 una vez y cuando pare seguimos con F7 despacio hasta encontrar en el código una serie de instrucciones que parecen ser las instrucciones de inicio del programa, en este caso serán estas pues el crackme esta escrito en Delphi:

 

PUSH EBP

 

MOV EBP,ESP

 

ADD ESP,-XXX

 

En el siguiente capitulo veremos diferencias entre los lenguajes de programación para orientarnos un poco mas.

 

8 confirmamos que esta dirección esta dentro de la zona code mirándolo en el memory map y si es así seguramente sea el OEP

 

9 la dirección donde comienzan estas tres instrucciones posiblemente sea el OEP o punto de entrada original que buscábamos, en este caso en mi PC lo hallo en 4251D0

 

10 una vez hallado el OEP debemos hacer un volcado del ejecutable, con esto crearemos un exe “nuevo” que tendrá como entry point el OEP que acabamos de hallar.

Estando parados en 004251D0 (primera dirección del OEP en este caso) vamos a Plugins - OllyDump – Dump debugged process

 

Vuelvo a repetir: las direcciones pueden cambiar según la maquina pero los pasos a seguir es lo importante.

 

 

Por supuesto esto se ira complicando según avancemos en el curso, pero lo que vayamos viendo en estos primeros capítulos de packers  nos ira preparando para lo que venga después.

 

Como curiosidad (de momento) fijaros: en PE editor vemos el entry point del exe empacado 34590 si le sumamos la image base (400000) es 434590, la dirección donde nos para el Olly al empezar a ejecutarlo con F9

 

Mirad que forma mas fácil de localizar el OEP:

 

Utilizando el plugin del Peid OEP finder (a veces el resultado de esta búsqueda no es correcto, pero esta vez si)

 

 

Peid no solo sirve para detectar protecciones, probad también estos botones del Peid 

 

También dentro del plugin de Olly - OllyDump tenemos un buscador de OEPs, pero lo que nos interesa es aprender la técnica de hallarlo a mano, por lo menos a los que somos curiosos y queremos aprender cosas nuevas, ya tendremos tiempo de utilizar estos plugins mas adelante.

 

 

Para los más vagos les diré que para cada empaquetador suele existir una aplicación que los desempaca automáticamente y así se evitaran leer estos tutoriales.

 

Hemos tocado un programa nuevo, PE Editor, hemos desempaquetado un programa comprimido con PE Compact, también hemos visto un poco por encima las secciones que componen los PE (ejecutables), en definitiva he intentado hacer este primer contacto con los empaquetados ameno sin cargarlo de teoría (que entre otras cosas hubiera sido un copy paste de otros tutos) he intentando orientar el rumbo del curso para ir viendo las cosas poco a poco, ya sabéis que esta explicado  como me hubiera gustado que me lo explicaran a mi que no tengo ni idea del "arte del crackeo", por tanto si algún maestro lo lee se dará cuenta de que faltan muchas cosas todavía por decir, todo llegara, cada maestrillo tiene su librillo.

 

Si alguien con conocimientos en la materia desea hacerme alguna corrección o piensa que faltó algo importante (soy un newbie) que no lo dude, que lo exprese en el foro o me mande un mensaje.

 

 



 

 

Capitulo siguiente

                                                                                                 


Marzo 2004

Pagina oficial del curso

 

Gracias a ...