|
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
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.
|
||||||||||||||||||||||||||||||||||||||||
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 -> 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 Seguidamente pulsaremos 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. |
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
|