You are on page 1of 163

INTRODUCCION AL CRACKING CON OLLYDBG DESDE CERO

La idea de esta INTRODUCCION AL CRACKING CON OLLYDBG DESDE CERO es la de dar una base para todos los que recin se inician en el arte del cracking con OLLYDBG, tratando de ser una introduccin pero a su vez que proporcione una base fuerte para poder ingresar a la lectura y comprensin de tutoriales mas avanzados como los que se encuentran en el actual NUEVO CURSO de CRACKSLATINOS, el cual por supuesto sigue abierto para seguir agregando novedades, concursos y teoras como hasta ahora. La idea se genero a partir de que los newbies actuales que leen el llamado NUEVO CURSO de CRACKSLATINOS, se encuentran con que este se inicia en un nivel muy alto, y no pueden insertarse gradualmente en el mismo, por lo cual se sienten frustrados y muchas veces abandonan antes de empezar, la idea de esta INTRODUCCION es no repetir los grandes tutes que existen en ese curso que son ya mas de 500 y de un nivel espectacular, si no mas bien sentar la base para que el que termine esta introduccin, le sea mas fcil leer cualquier tutorial, obviamente requerir esfuerzo como todo en el cracking, pero la tarea nuestra es tratar de alivianar ese esfuerzo, sentando aqu las bases del cracking en OLLYDBG para que sea compresible y se pueda entender fcilmente.

PORQUE OLLYDBG?
Aqu no entraremos a hacer grandes elucubraciones o reeditar viejas polmicas de SOFTICE vs OLLYDBG de cual es mejor ni nada de eso, creo que hasta los fanticos de SOFTICE reconocen que es mas sencillo empezar con OLLYDBG, ya que muestra mayor informacin y es mas cmodo para aprender, la idea es ingresar al mundo del cracking, por la puerta del OLLYDBG, mas adelante cuando uno ya conoce, puede trasladar fcilmente a cualquier debugger lo aprendido pues cambian las formas de usar de los programas, pero no la esencia.

LO PRIMERO ES LO PRIMERO
Exactamente lo primero es munirse de la herramienta que vamos a utilizar mayormente, para ello pueden hacer clic AQUI para bajarlo.

Como aqu estamos empezando desde cero pues, recin nos estamos haciendo del archivo, y ahora ya que es un archivo zipeado, lo unzipearemos con WINZIP preferentemente a una carpeta en nuestro disco rgido que podamos localizar fcilmente, una buena idea seria poner dicha carpeta en C:/ aunque funciona en cualquier lugar, yo la pondr en C:/.

Una vez descomprimido podemos entrar a la carpeta y ver

All esta el archivo ejecutable OLLYDBG.exe el cual ejecutaremos para arrancar el OLLYDBG y al cual para comodidad le har un acceso directo en mi escritorio.

Bueno ya tenemos bajado y preparado para arrancar a nuestro OLLYDBG.exe, lo ejecutamos.

Nos aparece este cartel avisndonos que la DLL que esta en la carpeta de OLLYDBG es mas antigua que la de sistema, si apretamos SI, borrara la antigua de la carpeta del OLLY y usara la de sistema, yo a pesar de no ver grandes diferencias siempre prefiero elegir que use la propia antes que la de sistema, ya que fue concebido con esa dll, por lo tanto elijo NO.

All esta el OLLYDBG vaco, y como siempre el primer programa que abriremos mas que nada para mirar las diferentes partes del OLLYDBG y a vuelo de pjaro poder ubicarnos en sus diferente partes, es el famoso CRACKME DE CRUEHEAD que vendr adjunto en este tutorial. Para abrir el archivo a debuggear en el OLLYDBG, vamos a FILE OPEN o hacemos clic en el icono

Se abrir la ventana para que busquemos el archivo a debuggear en este caso es el crackme de CRUEHEAD.

All se abre el susodicho crackme y por ahora no importa que no entendamos lo que nos muestra ya mas adelante aprenderemos eso, la idea es ir mostrando las partes del OLLYDBG y ciertas configuraciones del mismo para que cuando en sucesivos tutes, diga, por ejemplo vayan al DUMP, sepan al menos donde esta, as que esto es mas que nada para ubicacin, no es un tute profundo sobre OLLY.

All vemos la cuatro partes de la ventana principal del OLLYDBG

1)DESENSAMBLADO : Tambin llamado listado, aqu el OLLY nos muestra el listado desensamblado del programa que vamos a debuggear, por DEFAULT el OLLY viene configurado para analizar el programa que vamos a debuggear al iniciar, esto se configura en OPTIONS-DEBUGGING OPTIONS.

O sea al estar marcada esa tilde en AUTO START ANALISIS OF MAIN MODULE el OLLYDBG analizara el programa y mostrara informacin adicional sobre el mismo.

All esta el listado inicial del crackme de CRUEHEAD analizado, y si arranca sin analizar debajo podemos ver la diferencia.

La ventana analizada muestra mas informacin, que aunque aun no sepamos bien que es, se ve mas completa, igual es bueno saber que de la ventana analizada se puede quitar el anlisis, si uno no esta de acuerdo con el mismo o uno se da cuenta que el mismo esta equivocado lo cual puede ocurrir. Muchas veces el OLLYDBG muestra partes que no son listado correcto porque interpreto mal el cdigo ejecutable como datos, en ese caso se ven unos DB como estos

En ese caso puedo quitar manualmente el anlisis que el OLLYDBG ha realizado haciendo CLICK DERECHO en el listado y eligiendo ANALISIS-REMOVE ANALYSIS FROM MODULE

y en ese caso el listado se vera sin anlisis pero correcto

Otra cosita que hace a la claridad para trabajar y que por lo menos a mi me gusta, aunque cada uno puede variar en estos temas es colorizar los JUMPS Y CALLS eso se hace haciendo clic derecho APPEARENCE HIGHLIGHTING JUMPS AND CALLS

El resultado es el siguiente

All vemos que en celeste quedan resaltados los CALLS y en amarillo los JUMPS, lo cual es mas claro para la vista. Bueno con eso nuestro listado queda mas fcil de interpretar, aunque aun no tengamos la mas remota idea de que significa, pero bueno hay que preparar antes las herramientas para poder ir de a poco aprendiendo 2)REGISTROS

La segunda ventana importante del OLLYDBG es la de los REGISTROS

Recordamos que la ventana de registros se encuentra en la parte superior derecha del OLLYDBG, all muestra bastante mas informacin que los registros en si.

Tiene muchsima ms informacin que aun no veremos, pero se puede cambiar el modo de visualizacin en tres formas. (VIEW FPU REGISTERS, VIEW 3D NOW REGISTERS y VIEW DEBUG REGISTERS) por default viene elegida la primera.

Por ahora no ahondaremos mucho en eso ya que nos preocuparemos ms que nada en el tema REGISTROS y FLAGS, lo menciono para que sepan que hay varias vistas en el registro. 3)STACK O PILA:

Bueno all vemos el llamado STACK O PILA aqu no hay mucha configuracin posible solo la opcin de mostrar la informacin relativa al registro ESP o al registro EBP.

Por default y lo que mas se utiliza es la vista relativa a ESP, pero para cambiar a la vista segn EBP, haciendo clic derecho en el stack eligiendo GO TO EBP cambiamos y para volver GO TO ESP volvemos a la opcin por default.

En sucesivas entregas explicaremos bien el funcionamiento del stack por ahora miramos como se puede variar su configuracin solamente.

4) DUMP: La ventana del DUMP tiene muchas opciones de visualizacin, por DEFAULT nos muestra la visualizacin HEXADECIMAL de 8 columnas o bytes, la cual puede ser modificada haciendo CLICK DERECHO en el DUMP y eligiendo la opcin deseada.

La opcin por DEFAULT es la que generalmente mas se usa, aunque tenemos opciones para cambiar para mostrar desensamblado (DISASSEMBLE), Texto (TEXT) y diversos formatos (SHORT, LONG, FLOAT)

Y adems la opcin SPECIAL PE HEADER que mas adelante en prximos captulos veremos para que sirve esto que es muy til.

Ya conocemos las partes que se ven en la ventana principal del OLLYDBG, aunque tambin hay ms ventanas que no se ven directamente, se puede acceder a ellas, tanto por el men, como por los botones de las vistas.

Veremos que es cada uno El botn L o VIEW-LOG nos muestra lo que el OLLYDBG escribe en la ventana del LOG lo cual puede ser configurado para mostrar diferentes tipos de informacin, por default en la ventana del LOG va guardando all informacin sobre el arranque, y de la informacin escrita en el mismo por los diferentes BREAKPOINTS CONDICIONAL LOGS, lo cual se vera mas adelante, por ahora vemos all ,la informacin del proceso que arranco, en este caso el crackme de cruehead, las dll que cargo, y ciertos tips sobre el anlisis.

Una de las opciones mas importantes de esta ventana es la de loguear a una fila, para ciertos casos que deseemos guardar la informacin en una fila de texto, en ese caso CLICK DERECHO-LOG TO FILE.

El botn E o VIEW-EXECUTABLES nos muestra la listado de los ejecutables que utiliza el programa, exe, dlls, ocxs, etc

Aqu tambin el botn derecho tiene muchas opciones que por ahora no veremos ya que estamos mirando en forma general al OLLYDBG. El botn M o VIEW MEMORY, nos muestra la memoria ocupada por nuestro programa, all se ven las secciones del ejecutable, dlls que utiliza el proceso, as como el stack y diversas secciones allocadas por el sistema, y muchas veces al correr los programas, los mismos realizan nuevas allocaciones de memoria. En tiempo de ejecucin.

Haciendo clic derecho podemos hacer SEARCH en la memoria para buscar en ella, strings, cadenas hexa, unicode etc, adems nos da la posibilidad de colocar diferentes tipos de breakpoints en la secciones, como asi tambin la posibilidad de cambiar el acceso a las mismas con SET ACCESS ya profundizaremos en esto. El botn T o VIEW-THREADS nos da el listado de los THREADS del programa

Aunque no sabemos aun que es esto y la explicacin llegara en los prximos captulos es bueno ir familiarizndose en donde esta cada cosa, luego aprenderemos que es y como se usan mas adelante. El botn W o VIEW-WINDOWS nos muestra las ventanas del programa, como aun no corri, no hay ventanas as que esta vaca.

El botn H o VIEW-HANDLES, nos muestra los handles por ahora localcenlo, ya explicaremos que es y para que sirve

El botn C o VIEW-CPU nos retorna a la ventana principal del programa. El botn / o VIEW-PATCHES nos muestra los parches si el programa ha sido modificado, por ahora esta vaco al estar sin cambios

El botn K o VIEW-CALL STACK nos muestra el call stack, que es el listado de los calls que entramos, hasta el punto donde el programa esta detenido.

El botn B o VIEW-BREAKPOINTS es el listado de los breakpoints comunes colocados en el programa, no muestra los hardware breakpoint ni los memory breakpoints aqu, solo los BP comunes.

El botn R o VIEW- REFERENCES nos muestra la ventana de referencias la cual nos da los resultados de cuando hacemos una bsqueda de referencias en el OLLY

El botn o VIEW-RUN TRACE, nos muestra el listado si hemos hecho algn RUN TRACE en nuestra maquina, y tiene tambin la posibilidad de elegir LOG TO FILE, para guardar el resultado del traceo en un archivo txt

Bueno hasta aqu un paneo a vuelo de pjaro por los botones mas importantes, no detallamos explicacin porque aun hay que aprender antes algo de ASM, y practicando el uso del OLLYDBG podremos ir aclarando mas profundamente para que sirve cada botn y cada OPCION, la idea es irse familiarizndose con donde estn las cosas que veremos en las prximas entregas.

COMO CONFIGURAR EL OLLYDBG COMO JIT ( JUST IN TIME DEBUGGER) Aclaro que no conviene tener configurado el OLLYDBG constantemente COMO JIT, solo conviene hacerlo en ocasiones especiales, ya que al estar como JIT capturara el error de cualquier programa de nuestra maquina y arrancara solo, lo cual puede resultar molesto si no estamos debuggeando o crackeando, por lo tanto les enseo como se configura para casos especiales, pero conviene dejarlo con la opcin que trae por default que no esta como JIT. Para colocar el OLLYDBG como JIT vamos a OPTIONS-JUST IN TIME DEBUGGING

Y aprieto el botn MAKE OLLYDBG JUST IN TIME DEBUGGER y DONE

Para quitarlo, en el mismo lugar aprieto RESTORE JUST IN TIME DEBUGGER y DONE

Agregando PLUGINS al OLLYDBG El OLLYDBG trae la opcin para agregar plugins que nos son necesarios para realizar cierta tarea, por ahora solo agregaremos el plugin COMMAND BAR para aprender como se agregan los mismos. Bajamos el plugin COMMAND BAR el cual puede ser bajado de AQU y la mayora de los plugins se hallan AQUI

All esta bajado en mi escritorio el plugin lo descomprimo con WINZIP entro a la carpeta que descomprim a ver el contenido

Ahora antes que nada crearemos una carpeta para los PLUGINS en nuestra maquina, yo la creare en C:/ y la llamare PLUGINS nada mas. Voy a C y creo una NUEVA CARPETA

All esta, puede estar ubicada en cualquier lugar, pero a mi me gusta tener todo en C por eso la coloque all, de cualquier forma debemos configurar el OLLYDBG para que reconozca esta carpeta como la que tendr los plugins. Para ello en el OLLYDBG vamos a OPTIONS-APPEARANCE

Y en la ventana que se abre vamos a la pestaa DIRECTORIES

Vemos que en donde apunta al path de los plugins (PLUGIN PATH), en realidad nos esta apuntando a la carpeta donde esta el OLLYDBG.exe y podra dejarlo all, pero a mi me gusta tener los plugins separados por lo tanto en donde dice PLUGIN PATH- BROWSE busco la carpeta que cree para mis plugins.

All eleg la carpeta PLUGINS que cree y sale este aviso

O sea que debo reiniciar el OLLY para que me reconozca la nueva carpeta de plugins, pero antes copio el contenido que baje del comand bar a mi carpeta de plugins.

All copie todo el contenido y lo pego en mi carpeta PLUGINS

All esta el contenido del plugin Command Bar en la carpeta PLUGINS, cada plugin que baje y agregue solo deber copiar su contenido all, muchas veces con copiar solo la dll es suficiente. Ahorra cierro el OLLYDBG si lo tenia aun abierto y lo reinicio. Vemos que en el men PLUGINS me apareci el COMMAND BAR y las opciones del mismo.

A su vez en la parte inferior del OLLYDBG vemos la COMMAND BAR instalada

Es una barra para tipear comandos que nos facilitara mucho las cosas, mas adelante veremos su uso, por ahora lo importante es saber agregar plugins. Para quitar cualquier PLUGIN con solo quitar la dll correspondiente de nuestra carpeta PLUGINS y reiniciar el OLLYDBG, desaparecer, les aconsejo que dejen siempre activa la COMMAND BAR. Arranco nuevamente el crackme de CRUEHEAD EN OLLYDBG Las teclas mas usadas en el OLLYDBG son: F7: Ejecuta una sola lnea de cdigo (si estas en un CALL entra al mismo a ejecutarlo por dentro) F8: Ejecuta una sola lnea de cdigo (si estas en un CALL no entra al mismo lo ejecuta completo sin entrar y sigue en la siguiente lnea luego del CALL) Esos dos formas de tracear manualmente son verdaderamente diferentes y segn cada caso usaremos F7 o F8 lo cual veremos ms adelante. F2: Coloca un Breakpoint COMUN en la lnea que marcas con el Mouse o esta grisada en el listado, para quitar el BP apretas nuevamente F2. Por ejemplo:

Quiero poner un BP en 40101A pues marco con el Mouse esa linea

Al hacer clic una sola vez se marca y queda grisada como vemos en la imagen, luego apreto F2.

Vemos que se pinta de rojo la zona de la direccin, eso significa que hay activo un BP o Breakpoint all, si apreto F2 nuevamente se quita. F9: Para Correr el programa es similar a RUN, con esto el programa correr, hasta que encuentre algn BREAKPOINT, o alguna EXCEPCION que lo detenga o FINALICE por algn motivo, al apretar RUN veremos en la esquina inferior del OLLYDBG la palabra RUNNING o sea que esta CORRIENDO.

All arranco el CRACKME DE CRUEHEAD, lo podemos ver correr

Si PAUSO la ejecucin en OLLYDBG apretando F12 o DEBUG PAUSE

Vemos que el OLLYDBG cambia a mostrar PAUSED o sea que esta PAUSADO, podemos volver a hacerlo correr con F9 o DEBUG-RUN. Para cerrar el programa que esta siendo DEBUGGEADO apreto DEBUG-CLOSE

Bueno esto a sido una mirada a vuelo de pjaro del OLLYDBG la cual profundizaremos mas adelante pues tiene muchsimas opciones y configuraciones las cuales seguiremos estudiando en las prximas entregas, es muy til que bajen el programa lo configuren y miren donde estn las cosas que muestra este tute, as como le agreguen el plugin para practicar, y hagan correr y pausar el CRACKME DE CRUEHEAD, prueben ponerle un Breakpoint y practiquen esas cosas para que en la segunda entrega estn mas familiarizados con el mismo y podamos avanzar lento pero seguro, y sin dudas. Un abrazo a todos los CRACKSLATINOS Hasta la parte 2 Ricardo Narvaja 07 de noviembre de 2005

INTRODUCCION AL CRACKING CON OLLYDBG PARTE 2


Luego de haber visto a grandes trazos, la ubicacin y las principales partes del OLLYDBG, debemos aprender el sistema de numeracin utilizado y cual es el concepto de stack aunque sea para tener una idea, luego profundizaremos. SISTEMAS NUMERICOS Los tres sistemas numricos que ms se utilizan son el binario el decimal y el hexadecimal. El concepto bsico que deben tener de ellos es el siguiente: BINARIO: Se representa los nmeros con dos caracteres el 0 y 1 por eso se llama BINARIO. DECIMAL: Se representa todos los nmeros con 10 caracteres (del 0 al 9) por eso se llama decimal. HEXADECIMAL: Se representa todos los nmeros con caracteres del 0 al F ( del 0 al 9, mas A, B, C, D, E y F, o sea serian 16 caracteres en total). Normalmente a partir de aqu cuando diga un nmero y no diga a que sistema de numeracin pertenece es porque es HEXADECIMAL que es el que utiliza OLLYDBG, si son decimales o binarios aclarare expresamente. Existen formulas matemticas que no utilizaremos aqu, para convertir nmeros de un sistema al otro, que no son muy simpticas, pero llegado el momento, un cracker realmente usa la CALCULADORA DE WINDOWS, que es lo mas rpido y directo y no va a ponerse a hacer cuentas de potencias, sumas etc para convertir un numero de un sistema a otro. Abramos la CALCULADORA DE WINDOWS y preparmosla

All vemos en el men VER como se puede cambiar a CIENTIFICA.

All vemos que por DEFAULT arranca en DECIMAL, y al lado tiene la opcin de cambiar a HEXADECIMAL (HEX), OCTAL (OCT) y BINARIO (BIN). El Octal que representa la numeracin con 8 caracteres no es muy usado en cracking pero la calculadora trae dicha opcin incluida, si se llegara a necesitar. Pues para pasar un nmero de un sistema a otro es muy sencillo, pongo la calculadora en el sistema del nmero que quiero cambiar, por ejemplo si quiero cambiar 55 de DECIMAL a HEXA, pongo la calculadora en DECIMAL y tipeo 55.

Ahora cambio la calculadora a HEXA y automticamente me lo convierte a ese sistema de numeracin

Ah esta 55 decimal equivale a 37. Resalte las letras A,B,C,D,E,F para ver que al pasar la calculadora a HEXA se nos habilita la posibilidad de teclear las mismas, que estaban deshabilitadas en modo DECIMAL. Creo que esta es la forma mas practica de manejarse con los sistemas de numeracin, y poder pasar valores de uno a otro sin grandes complicaciones. NUMEROS NEGATIVOS en HEXADECIMAL

Esto es lo mas duro de entender por lejos tratemos de ir despacio. En el sistema de numeracin hexadecimal, como podemos representar los nmeros negativos, ya que no se puede poner el signo menos delante como hacemos en la tradicional numeracin decimal ? Como hago para representar en formato hexadecimal -1 por ejemplo ? Pues aqu viene el problema y espero que se entienda. Solo tenemos la posibilidad de escribir en hexadecimal desde 00000000 hasta FFFFFFFF, como representaramos los nmeros negativos? Pues bien a un genio se le ocurri que en vez de representar desde 00000000 hasta FFFFFFFF todos nmeros positivos, usaramos la mitad para los positivos y la otra mitad para los negativos. Los nmeros positivos van entonces desde 00000000 hasta 7FFFFFFF y los negativos desde 80000000 hasta FFFFFFFF.

POSITIVOS 000000000 es igual a 0 decimal 000000001 es igual a 1 decimal .. .. 7FFFFFFF es igual a 2147483647 decimal (que seria el mximo positivo)

NEGATIVOS FFFFFFFF seria el -1 decimal FFFFFFFE seria el -2 decimal 80000000 seria -2147483648 decimal (que sera el mximo negativo)

Podemos probar averiguar en la Command Bar el valor de 7FFFFFFF para ello usamos el signo de interrogacin y a continuacin el valor que deseamos pasar a decimal,

Vemos a la derecha que nos da el valor DECIMAL correspondiente, que es 2147483647 sin problemas. Ahora cuando deseamos averiguar el valor de 80000000 que es negativo, vemos que no nos lo muestra sigue dando el resultado para 7FFFFFFF (esto es un bug de la Command Bar), as que como podemos hallar su valor en OLLYDBG ?

Con este pequeo truquito. Vamos a los registros y marcamos EAX

Luego hacemos CLICK DERECHO-MODIFY

Nos aparece una ventana en la que podemos colocarle a EAX el valor que queremos, as que aprovechamos y usamos dicha ventana para hacer las conversiones, en el primer rengln tipeamos el valor HEXADECIMAL que queremos convertir y en el segundo rengln nos aparcera el resultado en DECIMAL. En este caso vemos que 80000000 corresponde al valor -214783648 decimal.

Si averiguo el valor de FFFFFFFF all vale -1 decimal.

Por lo tanto en la ventana de modificar un registro podemos averiguar el valor de nmeros negativos perfectamente, luego para salir podemos CANCELAR as no realizamos ningn cambio. CARACTERES ASCII Uno de los temas que debemos conocer tambin es la forma en que nuestro sistema escribe datos en la pantalla, para eso asigna a cada carcter un valor hexadecimal, de forma que puede interpretar los mismos como si fueran letras, nmeros smbolos etc. De la teora de ASM de Caos Reptante le copiamos la tablita jeje all vemos a continuacin el valor decimal, en la segunda columna el valor hexadecimal y en la tercera el carcter o sea por ejemplo si quiero escribir un espacio en OLLY, tengo que usar el 20 o 32 decimal, cualquier carcter que necesitemos, sea letra o numero podemos verlo en esta tablita.

Dec. Hex. Carac t 32 20 esp 33 21 ! 34 22 " 35 23 # 36 24 $ 37 25 % 38 26 & 39 27 ' 40 28 ( 41 29 ) 42 2A * 43 2B + 44 2C , 45 2D 46 2E . 47 2F / 48 30 0 49 31 1 50 32 2 51 33 3 52 34 4 53 35 5 54 36 6 55 37 7 56 38 8 57 39 9 58 3A : 59 3B ; 60 3C < 61 3D = 62 3E > 63 3F ?

Dec. 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

Hex. Carac t 40 @ 41 A 42 B 43 C 44 D 45 E 46 F 47 G 48 H 49 I 4A J 4B K 4C L 4D M 4E N 4F O 50 P 51 Q 52 R 53 S 54 T 55 U 56 V 57 W 58 X 59 Y 5A Z 5B [ 5C \ 5D ] 5E ^ 5F

Dec. 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

Hex. Caract 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~

Por lo dems la command bar cuando averiguamos el valor de un numero hexadecimal, nos proporciona tambin el carcter ASCII correspondiente si tuviera, veamos un ejemplo tipeemos en la command bar. ? 45

Vemos que 45 corresponde a la letra E mayscula, si en la tabla anterior buscamos 45 en la columna del medio que corresponde a hexa vemos que es la letra E

69

45

Por lo demas en la ventana del DUMP del OLLYDBG, tenemos una columna que muestra los caracteres ASCII, si miramos all mismo en el crackme de CRUEHEAD la ventana del DUMP.

Vemos que al lado de la columna que representa los valores hexadecimales, esta la columna ASCII, donde podemos ver resaltadas algunas cadenas de texto compuestas por combinaciones apropiadas de caracteres ASCII. QUE ES EL STACK O PILA El stack o pila es una zona de la memoria, en la cual se van guardando datos que mas adelante deben ser recuperados. El nombre PILA es porque asemeja un mazo o pila de cartas o barajas que se encuentran en una mesa. En dicho mazo, si agregas una nueva carta solo podes hacerlo arriba de la pila y si quiero sacar una ser la de ms arriba de la pila de cartas. Esa es la caracterstica principal del stack es como un mazo de cartas, la carta que agregas a la pila ira arriba, y ser la primera que salga, cuando quites una. Ya veremos mas adelante en la explicacin de las instrucciones la forma de modificar o agregar y quitar cartas en nuestro mazo, o sea nuestro querido STACK que como recordamos del tute anterior esta representado en la parte inferior derecha del OLLYDBG.

Bueno creo que ya tienen bastante para quemarse un rato mas la cabeza nos vemos en la parte 3 donde explicaremos que son los registros y los flags y para que sirven. Hasta la parte 3 Ricardo Narvaja 08 de noviembre de 2005

INTRODUCCION AL CRACKING CON OLLYDBG PARTE 3 QUE SON LOS REGISTROS Y PARA QUE SIRVEN Ahora para que sirven y que son exactamente los registros? Bueno el procesador necesita asistentes en su tarea de ejecutar los programas. Los registros lo ayudan en ello, cuando veamos las instrucciones ASM veremos por ejemplo que no se pueden sumar el contenido de dos posiciones de memoria directamente, el procesador tiene que pasar una de ellas a un registro y luego sumarla con la otra posicin de memoria, este es un ejemplo pero por supuesto ciertos registros tienen usos mas especficos veamos. ESP apunta al valor superior del stack, vemos en nuestro Crackme de Cruehead como ejemplo.

ESP vale 12FFc4 y si miramos el stack en OLLY en el mismo momento

Vemos que apunta al valor superior de nuestro stack o dicho en forma simptica, a la carta superior de nuestro mazo de cartas o barajas. EIP es otro registro muy importante apunta a la instruccin que esta siendo ejecutada en este momento veamos

Veamos en el listado del OLLYDBG, que al arrancar el crackme de Cruehead, este paro all en 401000, que es la primera instruccin a ejecutar y por supuesto el valor de EIP cuando esta detenido all ser 401000.

Si apreto F7 ejecuta la primera instruccin y pasa a la siguiente.

EIP ahora vale 401002 y en al listado vemos que se ejecuto la primera instruccin y ahora estamos en 401002.

Los otros registros pueden tomar valores variables y sirven para asistir al procesador en las ejecuciones de las instrucciones, ECX es usado casi siempre como contador los dems son fluctuantes y asisten en la ejecucin de programas como veremos en la explicacin de cada instruccin.

Recordamos donde el OLLYDBG nos mostraba el valor de los REGISTROS

Vemos a simple vista que son EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI y EIP Esos son los llamados REGISTROS de 32 bits OLLYDBG expresa el contenido en hexadecimal, vemos por ejemplo que EAX vale 00000000, y el mximo valor que podra tener es FFFFFFFF, si lo pasamos a BINARIO seria 11111111111111111111111111111111.

Vemos que son 32 bits cada uno con la posibilidad de ser 0 o 1 en numero binario, por eso se llama a estos, registros de 32 bits. En el lenguaje ASM se pueden operar con partes de los registros de 32 bits, en este caso EAX, puede ser subdividido. Veamos en el OLLY para ms practicidad con un ejemplo:

Cambiare el valor de EAX a uno que yo quiera en este caso 12345678. Abro el OLLYDBG y all mi programa ser el CRACKME DE CRUEHEAD, aunque podra ser cualquiera. Una vez que arranca y para en el inicio hago clic derecho en EAX y elijo MODIFY

En la ventana que se abre escribo en la lnea hexadecimal el valor 12345678

Queda as

Luego acepto con OK

All vemos como quedo cambiado al valor que yo deseaba, OLLYDBG tiene la particularidad de poner en ROJO los valores que se modifican. Como decamos se pueden usar solo partes de EAX, en este caso AX seria el registro de 16 bits o sea las cuatro ultimas cifras de EAX, por lo tanto AX valdra en este caso 5678, corrobormoslo en OLLY en el commandbar tipeemos ? AX (ya que el signo de interrogacin sirve tambin para hallar el valor de una expresin o de un registro)

Cuando apreto ENTER

Vemos que dice 5678 que es lo que suponamos, AX son las ultimas cuatro cifras de EAX. Tambin existen AL y AH, cuales son estos miremos en OLLYDBG ? AL

? AH

O sea si EAX=12345678 AX son las ultimas cuatro cifras

AH la 5 y 6 cifra y a su vez AL las ultimas dos cifras

Tambin en la misma forma EBX se puede subdividir en BX, BH y BL y as sucesivamente existen subdivisiones para casi todos los otros registros. COMO CAMBIAR LOS VALORES DE LOS REGISTROS Ya vimos como se pueden cambiar valores de los registros en OLLYDBG, lo que hicimos en EAX se puede hacer en los otros registros de la misma forma, marcando el registro que deseamos cambiar de valor, luego haciendo CLICK DERECHO-MODIFY, salvo en el caso de EIP, dado que el mismo apunta a la instruccin que se esta ejecutando. Para cambiar EIP operamos de la siguiente forma: Ya que EIP siempre apunta a la instruccin que se va a ejecutar, elegimos una nueva instruccin en el listado.

Luego que esta marcada como en este ejemplo 40101A, hago en ella CLICK DERECHO-NEW ORIGIN HERE y cambiara EIP a 40101A, continuando el programa ejecutndose desde all.

Como vemos queda EIP valiendo 40101A

QUE SON LOS FLAGS? Como vimos en el primer tutorial en OLLYDBG debajo de los registros se encuentran los flags o banderas.

Vemos que los flags son C P A Z S T D y O Vemos que solo pueden tener valores de cero o uno, que nos advierten que al ejecutar determinada instruccin, ha ocurrido algo, segn el flag que sea.

Vayamos mirando que indica cada uno: EL FLAG O O FLAG OVERFLOW (DESBORDAMIENTO) Se activa cuando al hacer una operacin, el resultado cambia de signo dando un valor incorrecto. Miremos en OLLYDBG este ejemplo, como siempre en el CRACKME DE CRUEHEAD de paso vamos practicando usar el OLLYDBG. Modifico como hicimos antes el valor de EAX a 7FFFFFFF que es el mximo positivo posible.

Ahora le sumare 1, lo cual exceder la posibilidad de EAX de mostrar un resultado positivo ya que 80000000 ya corresponde a un nmero negativo Para eso apreto la barra espaciadora que me permite escribir instrucciones.

Me sale esa ventana donde escribo ADD EAX,1.

Al apretar el botn ASSEMBLE vemos que cambia la instruccin que haba antes en 401000 por la que yo escrib.

ADD EAX, 1 (ya lo veremos cuando enumeremos y expliquemos las instrucciones) seria sumarle a EAX el valor 1, y guardando el resultado en el mismo EAX. Veo que antes de ejecutar la lnea con F7 el flag O esta en cero

Si ejecuto la instruccin con F7 para ver que es lo que ocurre, al realizar dicha operacin veo que EAX al sumarle 1 se desborda y me muestra 80000000 lo cual traspasa la lnea del cambio de signo. El FLAG O se activa ponindose a 1 indicndome que la operacin excedi el mximo resultado posible y esa es su funcin indicar cuando ocurra desborde al ejecutar una instruccin.

El FLAG A o AUXILIAR Tiene una funcin similar pero para cuando se realizan operaciones con otros formatos que por ahora no nos interesan. El FLAG P o PARIDAD Dicho flag se activa cuando ejecutamos una instruccin y su resultado es un valor, que pasado a numero binario tiene una cantidad par de unos, como por ejemplo 1010, o 1100 o 1111000 que tienen resultados cuya cantidad de unos total es par. Para probar esto ya que tenemos en el OLLYDBG escrito ADD EAX,1 y como ya ejecutamos esa lnea para probar el flag anterior, pues la marcamos de nuevo y hacemos CLICK DERECHO-NEW ORIGIN HERE lo cual llevara EIP de nuevo a 401000 (volvemos atrs) y a que si apreto F7 se ejecute de nuevo la instruccin que escribimos ADD EAX,1.

All tenemos pues de nuevo justo antes de ejecutar la suma, con EAX valiendo 00000000 y el flag P valiendo 1, porque quedo as de la operacin anterior, veamos que ocurre cuando le sumamos 1 a EAX nuevamente. Apretamos F7

Vemos que P nos marca 0 porque el resultado que muestra EAX=00000001 que en binario es 1 y tiene un solo 1 o sea un numero impar de unos por eso no se activa. Y vuelvo a hacer ahora click derecho en nuestro ADD EAX,1 y de nuevo CLICK DERECHO- NEW ORIGIN HERE para volver a sumar 1 y apreto F7.

Vemos que EAX que vala uno, al sumarle uno nuevamente, ahora vale 2 que es 10 en binario y sigue el resultado teniendo un solo uno por lo cual el flag P no se activo, si repito el procedimiento una vez mas, volviendo atrs y apretando F7 para sumarle 1 nuevamente a EAX.

Ahora EAX vale 3 que en BINARIO es 11 o sea el resultado tiene un numero par de unos por lo cual se activo el FLAG P o de paridad. Con eso vemos como funciona el susodicho FLAG, al ejecutar una operacin solo mira el resultado y si el mismo en BINARIO tiene cantidad par de unos, se activa. El FLAG Z o FLAG CERO Uno de los ms conocidos y usados en el cracking es el FLAG CERO el mismo se activa cuando ejecutamos una instruccin y el resultado es cero.

Podemos volver con CLICK DERECHO-NEW ORIGIN HERE a nuestro ADD EAX,1 de 401000, pero cambiemos ahora el valor de EAX a FFFFFFFF que es -1 decimal, de forma de que cuando apretemos F7 y ejecutemos ADD EAX,1 , sumemos -1 +1 el resultado sea cero a ver si se activa el FLAG Z. Vemos que al apretar F7, EAX quedo en cero y como el resultado es cero, se activo el FLAG Z ponindose a uno.

Creo que queda claro que dicho flag, se activa cuando el resultado de una instruccin es cero ya veremos diversas formas de activarlo mas adelante. El FLAG S o FLAG DE SIGNO Se activa cuando el resultado de una operacin es negativo, o sea si quiero probarlo cambio EAX a FFFFFFF8 que es -8 decimal

Y vuelvo con NEW ORIGIN HERE a mi ADD EAX,1 al apretar F7 y ejecutarlo, estoy sumando a -8 el valor 1, el resultado es FFFFFFF9 que es -7 decimal, el cual es negativo aun por lo cual debera activarse el flag de SIGNO probemos en OLLY.

Vemos que al apretar F7 y hacer la suma se activa el flag S de signo quedando a 1, queda claro como funciona, resultado negativo de una instruccin se activa el FLAG S. EL FLAG C o CARRY FLAG Se activa cuando se excede el mximo valor posible que se puede mostrar, si ponemos EAX a FFFFFFFF y le sumamos 1 como hicimos las veces anteriores veremos activarse el CARRY FLAG ponindose a 1.

EL FLAG T , D e I No los explicaremos por ahora pues son bastante complejos, si lo haremos mas adelante, no tiene mayor inters por ahora, ya que vamos a explicar las instrucciones mas sencillas, as que los dejaremos para mas adelante. Bueno con esto tenemos una idea de que es cada registro y en que caso se activa cada FLAG, con esa informacin ya podremos en la tercera parte estudiar instruccin por instruccin ya que por ahora solo vimos la instruccin ADD para ayudarnos a comprender cuando se activaba cada FLAG. Se que esta parte y la que viene son las mas indigestas de todas as que lanla con paciencia, practiquen con el OLLY activar los FLAGS al ejecutar nuestro ADD EAX,1 y nos vemos en la parte 3 de esta INTRODUCCION. Es muy importante que queden bien grabados todos estos conceptos bsicos, recomiendo leer practicar y releer hasta que no haya dudas. Hasta la parte 4 Ricardo Narvaja 10 de noviembre de 2005

INTRODUCCION AL CRACKING CON OLLYDBG PARTE 4 INSTRUCCIONES


Como ya venimos diciendo en las anteriores partes, la idea de esta introduccin es ir aprendiendo a la vez que indigestndonos con la dura teora, practicndola en OLLYDBG para ir conociendo el mismo, y de paso ir tomado confianza e ir mirando las posibilidades que tiene. As como con los flags vimos en OLLYDBG que instrucciones los activaban, ahora veremos que ocurre al ejecutar cada instruccin en el mismo OLLYDBG lo cual da una idea mas cercana a la realidad y se hace mas llevadero. Veremos las instrucciones mas importantes si al mirar un listado uno encuentra alguna que no se definimos aqu, siempre se puede consultar un manual de ASM para ver que funcin cumple. NOP (NO OPERATION) Es la instruccin que al ejecutarla no hace nada ni provoca ningn cambio en registros, stack o memoria, por eso en ingles es NO OPERATION o sea que no hay operacin alguna, y para que se usa dirn, muchas veces al cambiar una instruccin por otra, queda un hueco ya que la instruccin que escribimos es mas corta, y hay que rellenar con NOPS para que el procesador no encuentre basura y de error. Tambin sirve para anular cualquier instruccin, si la reemplazo por nops el programa ejecutara los mismos en vez de la instruccin original y no har nada lo que es comnmente conocido como NOPEAR. Si abrimos nuevamente el crackme de cruehead.

All vemos el cdigo original en el inicio, lo que haremos ser nopear la primera instruccin PUSH 0, que es un comando de 2 bytes de extensin, para ello marcamos la lnea con el mouse, y luego apretamos la barra espaciadora o bien hacemos CLICK DERECHO ASSEMBLE.

All vemos que en el mismo men nos confirma que es lo mismo apretar la barra espaciadora, esto nos abrir una ventana para escribir la instruccin que queramos.

Escribo NOP y apreto ASSEMBLE.

Vemos que OLLY adems de escribirnos un NOP, como es bastante inteligente, reconoce que el PUSH que haba antes es un comando de DOS BYTES por eso para no desarmar el cdigo siguiente nos agrega otro NOP para completar con el NOPEADO del PUSH. Si comparamos ambas imgenes vemos que donde estaba el PUSH 0 ahora hay dos NOPS que al ejecutarlos no hacen nada, esto lo podemos corroborar, apretando dos veces F7 hasta llegar al CALL siguiente, si miramos al apretar si cambia algn registro o algo en el stack, o un FLAG, vemos que todo esta igual , lo nico que cambio fue EIP pues como sabemos apunta a la instruccin que se va a ejecutar y en este caso ahora es el CALL, pero no hay cambios en el resto de los registros ni stack, ni flags, ni memoria. Ahora veremos esos mismos 2 bytes que reemplazamos en el DUMP, para hallarlos all, debemos buscarlos por la direccin de memoria, vemos que la misma es 401000 y 401001

Voy a la ventana del DUMP y hago CLICK DERECHO - GOTO EXPRESSION y pongo la direccin de memoria a partir de la cual quiero que muestre los bytes que contiene.

Por supuesto tipeo 401000

Los que vemos es

El rojo es original puesto POR OLLY ya que cuando cambiamos bytes, OLLY nos los recuerda mostrandolos en color rojo, all vemos los dos 90 que pusimos y luego E8, FF y los siguientes bytes que ya pertenecen a la siguiente instruccin que es un CALL. Podemos en OLLY quitar lo que hemos escrito y volver al cdigo original? Jeje, si podemos. En cualquiera de los dos, sea en el DUMP o en el listado, marcamos los dos bytes que escrib.

Ahora hago CLICK DERECHO-UNDO SELECTION

Y aqu no ha pasado nada, vuelve a aparecer el PUSH original

Lo mismo si miramos el DUMP, vemos que ahora estn los bytes originales.

Bueno eso es todo en cuanto a la instruccin NOP sigamos adelante.

INSTRUCCIONES DE STACK
Bueno habamos dicho que el stack era como un mazo de cartas que se le agregaban o quitaban cartas por arriba del mismo. Por supuesto hay instrucciones para agregarle y quitarle cartas. PUSH La instruccin PUSH es la tpica instruccin que agrega una carta o valor al stack Vemoslo en OLLYDBG la primera instruccin del programa original del crackme de cruehead era un PUSH.

En este caso es un PUSH 0, al ejecutarla lo que har en este caso, ser colocar el 0 en la posicin superior del stack, sin sobrescribir lo que se encontraba antes lo cual quedara debajo. Veamos como esta el stack antes de ejecutar el PUSH, en mi maquina esta en esta direccin, en la de ustedes puede variar aunque el efecto ser el mismo.

Este es el stack en mi maquina, la direccin 12FFc4 puede variar en su mquina, ya que el stack se puede acomodar en otra direccin en cada caso, y el contenido inicial a veces tambin puede variar o sea que ustedes pueden tener otro valor que 7c816d4f, pero no importa al ejecutar F7, el cero pasara a la parte superior del stack y el resto quedara abajo, veamos apreto F7.

Vemos que al ejecutar F7 fue realmente como si se agregara encima el cero que vemos resaltado all, abajo en 12ffc4 sigue estando 7c816d4f, y no vario nada todos los mismos valores estn en las mismas direcciones del stack.

La nica diferencia que ahora el valor superior del stack es 12ffc0 y all esta el cero que pusimos con el PUSH, fue realmente como agregar una carta a un mazo, se coloco arriba y dejo el resto que estaba antes sin cambiar nada debajo. Vemos tambin que el puntero ESP que muestra la direccin del valor superior del stack ahora marca 12FFc0.

Por supuesto el comando PUSH tiene variantes no solo puedo agregar nmeros, si hago: PUSH EAX, agregare el valor de EAX en lugar del cero, podemos PUSHEAR cualquier registro, numero etc. Podemos PUSHEAR tambin el contenido de una direccin de memoria PUSH [401008] Veamos que se debe interpretar bien la diferencia con PUSH 401008 Sin corchetes Si hago PUSH 401008 lo que har ser colocar el nmero 401008 en el stack

Al ejecutarlo quedara as

En cambio si fuera PUSH [401008]

Los corchetes significan el contenido de la memoria en 401008 o sea que debemos ir en el DUMP a ver esa direccin y ver que hay alli. Con GOTO EXPRESSION 401008 vemos

Que los 4 bytes que hay all son CA 20 40 00, ejecutemos con F7 el PUSH

Vemos que mando al stack el valor que ley pero los bytes estn al revs o sea nosotros vemos en el dump CA 20 40 00 y los puso al revs o sea 00 40 20 CA. Bueno esta es una propiedad del procesador, al leer o escribir contenidos de memoria siempre los bytes se toman al revs, y bueno quejas al inventor del procesador jeje. Pero la idea que debe quedar grabada es que sin corchetes el valor es simplemente un nmero, y con corchetes el valor refiere al contenido de una direccin de memoria. Ahora vemos que el OLLY cuando escribimos PUSH [401000] interpreto y escribi

PUSH DWORD PTR DS:[401008] Porque ocurri eso

Es que si uno no aclara el OLLY interpreta que uno quiere leer los 4 bytes de esa posicin de memoria, eso es DWORD leer los 4 bytes completos ya veremos las otras variantes en otras instrucciones.

POP
La instruccin POP es la inversa de PUSH lo que hace es quitar la primera carta o el primera valor del stack y lo coloca en la posicin que indicamos a continuacin del POP, por ejemplo, POP EAX tomara el primer valor del stack y lo quitara movindolo a EAX, y ser como si quitamos una carta, ya que el valor que estaba debajo quedara como primero. Vemos arranquemos de nuevo el crackme de cruehead y en el inicio esta

Cambiemos dicha instruccin por POP EAX, marcamos la primera lnea, apretamos la barra espaciadora y tipeamos.

Ah esta el stack antes de ejecutar la instruccin esta

Y ESP apunta a 12FFc4 que es el valor superior del stack.

Y vemos que EAX esta a cero antes de ejecutar la lnea en mi caso. Apreto F7

Vemos que en el stack desapareci nuestra primera carta, ahora el primer lugar lo ocupa la que entes estaba 2da y ESP apunta a 12ffc8.

Pero donde fue a parar nuestra carta se perdi?, noo como era un POP EAX fue a parar a EAX vemos en la imagen que EAX ahora vale 7c816d4f en mi caso y en el suyo tendr el valor que antes estaba superior en el stack en vuestra maquina. Lo mismo si hubiera sido POP ECX el valor superior hubiera ido a ECX o al registro que eligiramos. Bueno ya vimos las instrucciones que ponen o quitan una carta al stack ahora tenemos. PUSHAD PUSHAD guarda el contenido de los registros en la pila en un orden determinado. As pues, pushad equivale a: push EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI. Veamos si es cierto lo que nos dice nuestro amigo CAOS REPTANTE en su tute de asm, jeje. Abrimos de nuevo el crackme de cruehead y ya sabemos que apretamos la barra para escribir y alli tipeamos PUSHAD.

All esta mi stack inicial y los registros antes de ejecutar el pushad son

Apreto F7 y veamos que paso en el stack

Vemos que hizo un PUSH a cada uno de los registros, el primero que agrego esta arriba de 12ffc4 que era el valor superior del stack antes de ejecutar, ahora hay un cero arriba que corresponde a PUSH EAX, luego hizo PUSH ECX y mando el 12ffb0 que estaba en ECX, luego envi consecutivamente los valores de los registros uno a uno al stack hasta el ultimo que fue PUSH EDI. POPAD

La inversa de PUSHAD es POPAD en este caso toma los valores del stack y los manda a los registros como si fuera un POP a cada uno. As popad equivale a: pop EDI, ESI, EBP, ESP, EBX, EDX, ECX, EAX. All mismo donde quedo del ejemplo anterior escribamos un POPAD

All esta para ejecutarse el POPAD los registros estn guardados en el stack y al apretar F7 vuelven del stack a sus lugares originales.

All esta el stack como era antes del pushad y los registros recuperan sus valores

La dupla PUSHAD-POPAD se usa mucho cuando se quiere guardar el estado de registros en un punto, realizar muchas operaciones que cambian registros y el stack, y luego con POPAD restaurar los registros y el stack al estado original. Existen algunas variantes como

PUSHA equivale a: push AX, CX, DX, BX, SP, BP, SI, DI. POPA equivale a: pop DI, SI, BP, SP, BX, DX, CX, AX (los valores recuperados correspondientes a ESP y SP, no se colocan en los registros sino que se descartan). En el caso de PUSHA y POPA es similar a sus hermanas PUSHAD y POPAD salvo se que utilizan en programas de 16 bits lo cual no nos interesa ya que OLLYDBG es un debugger para programas de 32 bits.

INSTRUCCIONES PARA MOVER DATOS


MOV Esta instruccin es lo que comnmente llamaramos MOVER, mueve el segundo operando al primero por ejemplo. MOV EAX, EBX Lo que hace es mover el valor de EBX a EAX, miremos en OLLY y nuestro bendito crackme de cruehead.

Ya no repetir como se escribe una instruccin ya lo hemos visto, veamos los registros antes de ejecutar

En mi maquina EAX es 0 y ECX es 7c91eb94, como son valores iniciales en la suya pueden ser diferentes pero al apretar F7 lo importante es que el valor de EBX lo mover a EAX, veamos apretemos F7.

Viola esta claro no? MOV tiene variantes por ejemplo MOV AL, CL Esto movera el valor de CL a AL veamos reinicio OLLYDBG y escribo

Los registros

Recordamos lo que vimos ya que AL son las ultimas dos cifras de EAX y CL las dos ultimas cifras de ECX, ejecutemos con F7

Vemos que sin tocar el resto de EAX y ECX el B0 se copio a AL, o sea las ultimas dos cifras de EAX. Tambin podemos mover a algn registro el contenido de una posicin de memoria o al revs.

En esta caso moveremos el contenido de 405000 a EAX y como dice DWORD sern los cuatro bytes lo que moveremos. Esta instruccin puede dar error si la direccin de memoria no existe, lo cual podemos ver fcilmente en el OLLY. Vamos al DUMP y hacemos GOTO EXPRESSION 405000

Vemos que existe y su contenido es 00 10 00 00 o sea al moverlo a EAX, dado que trabajamos con el contenido de una direccin de memoria se mover al revs o sea 00 00 10 00 apretemos F7 a ver que pasa

All esta el 1000 que ley de dicha direccin de memoria, ahora si quisiera escribir un valor en dicha direccin seria MOV DWORD PTR DS:[400500],EAX Reinicio el OLLYDBG y la escribo

En 405000 veo en el DUMP

Al apretar F7 oops

Me da una excepcin y eso es porque la seccin donde vamos a escribir no tiene permiso de escritura, lo cual impide cambiar bytes ejecutando instrucciones.

Bueno ya veremos como cambiar permisos de secciones mas adelante lo importante es que ya conocen la instruccin. Obviamente como podemos mover 4 bytes especificando la palabra DWORD si usamos WORD mover 2 y si usamos BYTE mover 1 . Veamos MOV AX,WORD PTR DS:[405008]

En este caso mover dos bytes del contenido de 405000 a AX, en este caso no podemos escribir EAX ya que como son solo 2 bytes los que movemos debemos usar el registro de 16 bits AX. Veamos que hay en el DUMP en 405008

Al apretar F7 debera mover solo esos 2 bytes a AX, veamos

All esta en AX, al revs como corresponde a leer de contenidos de memoria, el resto de EAX no ha sido cambiado solo lo correspondiente a AX. Lo mismo seria si usramos BYTE MOV AL, BYTE PTR DS:[405008] En este caso movera a AL el ultimo byte solamente o sea el 08.

MOVSX (Move with Sign-Extension) Copia el contenido del segundo operando, que puede ser un registro o una posicin de memoria, en el primero (de doble longitud que el segundo), rellenndose los bits sobrantes por la izquierda con el valor del bit ms significativo del segundo operando. Aqu tenemos un par de ejemplos: La definicin la sacamos del tute de CAOS ahora veamos un ejemplo en OLLYDBG para aclarar y usemos a nuestro amigo CRUEHEAD.

Como aun no se los dije porque soy muy malo y quera que siempre buscaran a mano, los valores de los operandos jeeje, OLLYDBG tiene una ventana de aclaraciones que esta justo debajo de el listado y arriba del DUMP.

All vemos que la ventana de aclaraciones nos muestra el valor de los operndoos de nuestra instruccin en mi caso BX vale F000 eso lo puedo corroborar en los registros

Y all mismo veo que EAX vale cero, as que siempre el OLLYDBG nos ayuda a interpretar los operandos de la instruccin a ejecutar. (que malo soy jeje pero quise que fijen el concepto de donde buscar cada cosa antes de la comodidad jeje) Al apretar F7

Vemos que se copia el BX que era F000 a AX y que se rellena con FFFF ya que el numero es un negativo de 16 bits , si hubiera sido BX 1234 entonces quedara EAX=00001234 ya que rellena con ceros al ser BX positivo. El tema de los positivos y negativos de 16 bits es similar a 32 bites se divide por la mitad el espacio 0000 a FFFF de 0000 hasta 7FFF son positivos y de 7FFF a FFFF son negativos vemos que si modificamos BX a 7FFF y ponemos EAX a cero y volvemos a ejecutar la instruccin

Copia 7FFF a AX pero rellena con ceros ya que 7FFF es positivo si repetimos pero con BX=8000 que es negativo,

Ejecuto nuevamente con F7 y

Copia BX a AX y rellena con FFFF ya que 8000 es negativo MOVZX (Move with Zero-Extend)

Igual a movsx, pero en este caso, los espacios sobrantes se rellenan siempre con ceros o sea no depende de si el segundo operando es positivo o no como en el caso anterior no haremos ejemplos porque es sencillo darse cuenta que todos los ejemplos anteriores daran en EAX 0000 y a continuacin los bytes de BX que se copiaron a AX.

LEA (Load Effective Address) Similar a la instruccin mov, pero el primer operando es un registro de uso general y el segundo una direccin de memoria. Esta instruccin es til sobre todo cuando esta direccin de memoria responde a un clculo previo. Esto nos dice nuestro amigo CAOS y significa que en este caso por ejemplo reinicio OLLY.

Aqu es el nico caso en que hay corchetes que no se mueve el contenido de la direccin de memoria que se calcula dentro del corchete si no la direccin en si. En mi caso ECX vale 12FFb0

Y lo que hace LEA es sumarle 38 en este ejemplo y mover ECX mas 38 que es igual a 12ffe8 a EAX En la ventana de las aclaraciones ya muestra ambos operndoos

Muestra que un operando es 12FFe8 que proviene de sumar ECX+38 y EAX vale cero antes de operar. Al apretar F7

Dicha direccin se mueve a EAX, hay que tener cuidado porque los corchetes nos llevan a pensar que deberamos mover el contenido de la direccin 12ffe8 que debemos buscar en el dump como en el caso de la instruccin MOV, pero LEA solo mueve la direccin al primer operando no su contenido. XCHG (Exchange Register/Memory with Register) Esta instruccin intercambia los contenidos de los dos operandos. En este caso intercambia los valores si escribimos XCHG EAX,ECX El valor de EAX pasara a ECX y viceversa comprobmoslo en OLLY

Antes de ejecutar en mi maquina EAX vale cero y ECX vale 12FFb0

Al apretar F7 vemos que intercambian sus valores

Tambin se puede usar para intercambiar con una posicin de memoria siempre que tenga permiso de escritura dicha seccin

Al ejecutar con F7

Nos pasa lo mismo que cuando quisimos hacer MOV a dicha direccin al no tener permiso de escritura nos genera una excepcin. Bueno creo que como primera parte de las instrucciones ya tienen para divertirse y practicar, creo que los ejemplos si los van haciendo mientras leen aclaran bastante la cosa, en la siguiente parte seguiremos con mas instrucciones hasta terminar con las mas importantes y tratar de terminar esto que es lo mas duro. Hasta la parte 5 Ricardo Narvaja 13 de noviembre de 2005

INTRODUCCION AL CRACKING CON OLLYDBG PARTE 5


INSTRUCCIONES MATEMATICAS INC Y DEC Estas instrucciones incrementan o decrementan respectivamente el operando, sumndole uno si es INC o restndole uno en el caso de DEC. Veamos en el OLLY, como siempre abrimos el OLLYDBG y el crackme de cruehead y en la primera lnea escribimos

EAX en el estado inicial en mi maquina esta a cero, si no puedo cambiarlo a cero a mano

As que al apretar F7 y ejecutar la instruccin se INCREMENTARA EAX en uno veamos apretemos F7

Lo mismo ocurre con DEC podemos escribirlo debajo del anterior

Al apretar F7 y ejecutar la instruccin se DECREMENTA EAX que estaba en 1 y volver a 0.

Tambin se pueden incrementar o decrementar el contenido de posiciones de memoria

Aunque en este caso la seccin no tiene permiso de escritura y no dejara aumentar el contenido dando excepcin.

Si la seccin hubiera tenido permiso de escritura, vamos en el dump a la direccin 405000

Ya que el contenido al leerlo al revs es 00001000, si lo incrementamos seria 00001001 o sea quedara as

Este fue el caso para DWORD sumndole UNO a los 4 bytes del contenido.

En el caso de WORD el ejemplo sumaria solo a los ltimos 2 bytes

Y en el caso de BYTE sumaria solo al ltimo byte

ADD Add como ya vimos es la instruccin correspondiente a la suma, siempre suma ambos operandos y guarda el resultado en el primero. ADD EAX,1 es similar a INC EAX Tambin puede sumar registros Veamos en OLLY

Antes de ejecutar la operacin

En mi maquina EAX vale 00000000 y ECX vale 12FFB0 en sus maquina puede tener otros valores, pueden cambiarlos si quieren, pero al apretar F7 sumara ambos y guardara el resultado en EAX, veamos

All esta EAX esta en rojo pues fue el que se modifico y tiene el resultado de la suma. Tambin podemos sumar a un registro el contenido de una memoria

En este caso no hay problema por el permiso de escritura ya que como EAX cambiara y guardara el resultado y el contenido de [405000] no cambiara ya que es el segundo operando, la operacin no generara excepcin. Antes de apretar F7 vemos que EAX vale 0 y el contenido de 405000 vale 00001000

Apreto F7 y se ejecuta la suma

Entonces EAX=0 mas 1000 se modifica EAX quedando el resultado all que es 1000. Si hacemos al revs y escribimos

En este caso el resultado se guardara en el contenido de 405000 y esto modificara el mismo por lo cual al apretar F7 generara una excepcin al no tener permiso de escritura.

ADC (ADD WITH CARRY) En este caso se suman ambos operandos y se le suma el valor del CARRY FLAG O FLAG C y se guarda en el primer operando.

All vemos que sumara EDX que vale 21 mas 3 mas el valor del flag C, que en este caso es cero, si apreto F7.

Veo que el resultado es 24, pero si repito la operacin con el FLAG C puesto a 1 el cual se puede cambiar haciendo doble click en el mismo.

All lo cambie a uno y pongo todo como antes para repetir la operacin solo cambiando el flag C.

Apreto F7 para que se realice la suma y ahora el resultado es 25

Ya que suma EDX =21 mas 3 mas el FLAG C que en este caso vale 1. SUB Es la resta o substraccin o sea la operacin contraria a ADD, lo que hace es restar el segundo operando al primero y guardar el resultado en el primer operando.

En mi maquina los registros valen antes de ejecutar

Al apretar F7 le restara a EAX que vale cero el valor 2

El resultado es -2 que en hexadecimal se representa FFFFFFFE si hacemos doble click en dicho valor

Vemos que corresponde al decimal -2. Tambin se pueden restar registros, y posiciones de memoria en la misma forma que lo hicimos con ADD. SUB EAX,ECX Por ejemplo har EAX-ECX y guardara el resultado en EAX Y SUB EAX,DWORD PTR DS:[405000] Restar a EAX el contenido de la posicin de memoria 405000, guardando el resultado en EAX. En el caso inverso SUB DWORD PTR DS:[405000],EAX Ya que el resultado se guarda en el primer operando, si no tenemos permiso de escritura en la seccin, nos dar una excepcin. SBB Es la operacin contraria a ADC, es este caso se restan ambos operandos y se le resta el valor del CARRY FLAG O FLAG C y se guarda en el primer operando.

Antes de ejecutar la operacin ponemos EDX a 21 y el carry flag a 0

Al apretar F7 har EDX-3 y le restara cero del FLAG C

Ahora su repito la operacin con el FLAG C a 1

Apreto F7 y ahora har EDX-3 y le restara 1 del FLAG C

En este caso el resultado es 1D. MUL Bueno hay dos instrucciones para realizar multiplicaciones, la primera de ellas es MUL, la cual no considera los signos de los nmeros que va a multiplicar, y usa un solo operando el otro operando es siempre EAX aunque no se escribe y el resultado lo guarda en EDX:EAX que quiere decir esto veamos el ejemplo.

Por ejemplo MUL ECX Esto multiplicara ECX por EAX y guardara el resultado en EDX:EAX y no considerara el signo de los operandos. Por ejemplo veamos en OLLYDBG

Pongo EAX a FFFFFFF7 y ECX a 9 si realizo la multiplicacin en la calculadora de Windows veo que

El resultado es

Y no entra en EAX veamos que pasa en OLLY al apretar F7

All vemos en rojo que EDX y EAX cambiaron y como vemos guarda en EAX los bytes que entran all y luego guarda los que no entran en EDX, en este caso el 8 que no puede mostrar EAX, lo guardo en EDX, por eso se dice que en este caso el resultado se muestra en EDX:EAX ya que usa ambos como si fueran un solo registro del doble de largo. En el caso MUL DWORD PTR DS:[405000] Multiplicara el contenido de 405000 por EAX y como siempre guardara el contenido en EDX:EAX sin considerar el signo de los operandos. Siempre que en OLLY queramos ver cuanto es el valor de un numero hexadecimal sin signo, hacemos doble click en cualquier registro

Como habamos visto la segunda lnea nos daba el valor con signo en este caso FFFFFFAF es -81 considerado con SIGNO, pero en operaciones como MUL donde los nmeros se consideran SIN SIGNO el valor decimal se lee en la tercera lnea la que dice UNSIGNED, all vemos 4294967215 seria el valor tomando al numero como positivo o sin SIGNO. IMUL (multiplicacin con signo) La instruccin IMUL no solo es multiplicar con signo de la misma forma que lo hacia MUL IMUL ECX Es igual que antes ECX por EAX y el resultado se guarda en EDX:EAX salvo que se considera el signo de los operandos. Adems de la similitud con la instruccin anterior IMUL permite poner mas de un operando, lo que no estaba permitido en MUL. Del tute de CAOS Adems de la utilizacin de los registros EAX y EDX, as como de sus subdivisiones, pueden especificarse otros orgenes y destinos de datos y puede haber hasta tres operandos. El primero, es el lugar donde se va a guardar el resultado, que debe ser siempre un registro, el segundo y el tercero son los dos valores a multiplicar. En estos ejemplos vemos como estas instrucciones con dos o tres operandos, tienen el mismo espacio para el resultado que para cada uno de los factores: F7EB imul ebx EAX x EBX -> EDX:EAX

Este primer ejemplo es el conocido y similar a MUL salvo que se consideran los signos 696E74020080FF imul ebp, dword ptr [esi+74], FF800002 [ESI+74] x FF800002 -> EBP

Este es el segundo ejemplo que pone veamos en este caso hay tres operandos, multiplica el contenido de ESI+74 por FF800002 y el resultado lo guarda en EBP, podemos hacerlo en OLLY Copio la linea imul ebp, dword ptr [esi+74], FF800002 al OLLY

Veo que al apretar ASSEMBLE me da error y eso es porque en el OLLY los nmeros que empiezan por letras deben agregrsele un cero delante si no, no los interpreta, corrijamos

Ahora apreto ASSEMBLE y lo acepta

Cambio el valor de ESI a 401000 para asegurarme que la direccin ESI mas 74 exista y se pueda leer su contenido

Veamos en la aclaracin del OLLY

Alli nos dice que ESI + 74 es la direccin 401074 y que su contenido es C7000000, veamos en el dump con GOTO EXPRESSION 401074.

Y si, es cierto el contenido ledo al revs seria C7000000, eso lo multiplicara por FF800002 y como el primer operando es EBP pues guardara all el resultado imul ebp, dword ptr [esi+74], FF800002 Al apretar F7 vemos que se puso rojo EBP ya que ahora contiene el resultado

El resultado en la calculadora nos da C7000000 * FF800002

Pero como especificamos que se muestre en EBP pues solo muestra los bytes que caben all, el resto los descarta. En el tercer ejemplo que hay solo dos operandos se multiplican ambos y el resultado se guarda en el primero.

0FAF55E8

imul edx, dword ptr [ebp-18]

EDX x [EBP-18] -> EDX

Como vemos la mejor opcin para multiplicar nmeros largos es usando IMUL con solo un operando pues en este caso el resultado lo guarda en EDX:EAX con la posibilidad del doble de largo lo cual no ocurre cuando usamos dos o tres operandos, dichas opciones son mas tiles en operaciones pequeas. DIV (Unsigned Divide) / IDIV (Signed Divide) Estos son la contrapartida de MUL Y IMUL respectivamente DIV solo tiene un operando y no considera los signos y el resultado se guarda en EDX:EAX IDIV siempre considera los signos si usa un solo operando ser como DIV y guardara en EDX:EAX y en el caso de dos operandos dividir ambos y guardara en el primero, y en el de tres operandos dividir el segundo y el tercero y guardara en el primero. No creo que sea necesario repetir los ejemplos pues son similares a los de MUL e IMUL. XADD (Exchange and Add) Es como realizar en una sola instruccin XCHG y ADD o sea que si tenemos XADD EAX,ECX

All vemos ECX que es 1 y EAX es 7 al apretar F7 se intercambian o sea que EAX pasa a valer 1 y ECX 9 luego se suman

Como vemos el resultado se sigue guardando en el primer operando, lo nico que cambio fue que se intercambiaron los valores antes de sumarlos, vemos que ECX quedo valiendo 9 que era lo que vala EAX antes de intercambiarse y sumarse. NEG Esta instruccin tiene la finalidad de cambiar de signo el nmero representado o sea que si tenemos el nmero 32 en hexa y le aplicamos NEG el resultado ser el negativo del mismo. Ejemplo

Escribo en OLLY NEG EAX y pongo en EAX el valor 32

Al apretar F7 quedara en EAX el negativo de 32 veamos

All vemos el resultado -50 en decimal como nos muestra la segunda columna corresponde a -32 en hexa.

All esta si tipeamos en la comandbar que nos de el valor de -32 hexa en decimal, nos dice -50 y nos aclara que se escribe FFFFFFCE ya que no se puede escribir el signo en OLLY. Pues como vemos la instruccin NEG nos convierte el operando en su negativo.

INSTRUCCIONES LOGICAS
Provienen de realizar operaciones lgicas entre dos operandos pasados a binario bit a bit y guardando el resultado en el primer operando

AND El resultado es 1 si los dos bits son 1, y 0 en cualquier otro caso. 1 and 1 = 1 1 and 0 = 0 0 and 1 = 0

0 and 0 = 0 Vemos un ejemplo en OLLYDBG AND EAX,ECX

Pongamos ECX=0001200 y EAX=3500

Si lo hiciramos a mano deberamos pasar a binario ambos 1200 en binario seria 01001000000000 3500 en binario seria 11010100000000 Aplicndole la tablita de la operacin AND bit a bit vemos que por ejemplo la ultima cifra

Al hacer AND entre dos ceros el resultado seria cero, as hay que hacer bit a bit y nos dara 01000000000000 ya que el resultado es uno solo cuando los dos bits son 1 y eso ocurre solo en la columna resaltada.

Si ejecutamos F7 en el OLLY vemos el resultado en ECX que es 1000 que pasado a binario es 01000000000000

OR
En esta instruccin realizamos el mismo proceso que la anterior solo que en vez de utilizar la tablita AND para hallar el resultado entre bits, lo hacemos con la tablita OR

El resultado es 1 si uno o los dos operandos es 1, y 0 en cualquier otro caso. 1 or 1 = 1 1 or 0 = 1 0 or 1 = 1 0 or 0 = 0

XOR
Aqu es similar solo que usamos la tablita de la funcin XOR para las operaciones entre bits El resultado es 1 si uno y slo uno de los dos operandos es 1, y 0 en cualquier otro caso 1 xor 1 = 0 1 xor 0 = 1 0 xor 1 = 1 0 xor 0 = 0

NOT

Simplemente invierte el valor del nico operando de esta funcin not 1 = 0 not 0 = 1 Ejemplo: not 0110 = 1001

Si tenemos por ejemplo EAX=1200 que en binario es 1001000000000 convertimos los 0 en 1 y los 1 en 0 considerando que es un numero de 32 bits y que al inicio tiene ceros o sea seria llenado de ceros delante hasta completar los 32 bits.

00000000000000000001001000000000 Al hacerle NOT quedara 11111111111111111110110111111111 que en la calculadora de Windows vemos que es FFFFEDFF en hexa

En OLLY antes de apretar F7 pongo EAX a 1200

Apreto F7

Vemos que el resultado es el mismo

Bueno aqu terminamos esta quinta parte veo que esto es un poco mas largo de lo que pensaba pero bueno vamos paso a paso, nos quedan ver las comparaciones, los saltos y los call y ret. Bueno paciencia que despacio se llega a ROMA Hasta la parte 6 Ricardo Narvaja 14 de noviembre de 2005

INTRODUCCION AL CRACKING CON OLLYDBG PARTE 6

COMPARACIONES Y SALTOS CONDICIONALES En trminos generales, las comparaciones entre dos operandos, y segn el resultado de esa comparacin la decisin si el programa saltara o no en un salto condicional posterior, suele ser lo primero que se menciona en cualquier tute bsico que comienza desde cero de cracking. Sabemos que si el programa nos pide un serial para registrarnos, en algn momento deber decidir si es correcto no y para ello deber comparar y realizar uno o varios saltos y la direccin adonde saltar variar segn si pusiste bien el serial o no. Ahora como funciona en profundidad la comparacin y el salto es lo que veremos a continuacin. Sabemos porque lo hemos visto ya en partes anteriores de esta introduccin, que segn el resultado una instruccin se activan o desactivan los flags, el caso mas conocido es el flag que se activa cuando el resultado de una instruccin es cero el FLAG Z y hemos visto diferentes formas de activar los flags segn el resultado de una instruccin. CMP Esta es la instruccin mas conocida de comparacin y lo que hace es comparar dos operandos, en realidad es una instruccin SUB, que no guarda el resultado de la resta en el primer operando, ambos operandos quedan igual, lo que cambian son los flags segn el resultado. Como vimos si hacemos por ejemplo CMP EAX, ECX Siendo EAX y ECX iguales, se restan ambos, no se modifican, pero el resultado de la resta es cero lo que hace activar el flag Z, veamos el ejemplo en OLLYDBG.

All escrib la instruccin y ahora modificare EAX y ECX para que sean iguales.

A apretar F7 veo que EAX y ECX no modificaron su valor pero se activo el flag Z, al haber realizado una resta y ser su resultado CERO aunque no podamos ver el resultado ya que no lo guarda.

En realidad no nos importa el resultado numrico de la resta en si, sino que de alguna forma podemos saber segn los flags si EAX era igual a ECX, o si son desiguales, cual es mayor. Como comentario ya que aun no hemos llegado a los saltos condicionales, los tienen dos posibilidades, deciden si saltar o no saltar segn el estado de los flags, el mas claro ejemplo y que trabajara en conjunto con la comparacin anterior es el salto JZ que salta si el FLAG Z esta activo o a UNO y no salta si esta inactivo o a CERO. De esta forma se logra que el programa tome una decisin, si fueran dos seriales que esta comparando, por ejemplo en EAX esta el serial que vos ingresaste para registrar un programa y en ECX esta el serial correcto, el programa podra decidir con un CMP que si son iguales se activa el flag Z, y el salto JZ al ver el flag activo, nos llevara a una zona para usuarios registrados, y si el serial que tipeaste y esta en EAX no es igual al de ECX que es el correcto, segu intentando jeje, el flag Z sigue a CERO, y no salta mantenindote en la zona de usuario no registrado. Ya veremos los ejemplos ms concretos al estudiar los saltos condicionales. De la misma forma con el flag S o de signo podemos ver si en una comparacin el primer operando era mayor que el segundo, o al revs. Miremos el ejemplo Repitamos el CMP EAX, ECX pero ahora pongamos EAX mayor que ECX

Si apretamos F7

Vemos que el FLAG Z es cero por lo cual ya sabemos que no son iguales, y a la vez el flag S es cero lo cual quiere decir que al hacer la resta EAX-ECX el resultado es positivo, lo cual significa que EAX es mayor que ECX. De la misma forma si repetimos la operacin con EAX menor que ECX

Y apretamos F7

All vemos que al dar la resta de EAX con ECX negativa ya que ECX es mayor, se activa el FLAG S que recordamos se activa con resultados negativos. Las diferentes posibilidades de comparacin activaran los correspondientes flags y segn lo que el programa necesite saltara o no de acuerdo a chequear la activacin de uno o mas de dichos flags. Tambin permite la comparacin entre registros y posiciones de memoria utilizando DWORD, WORD y BYTE .

All comparara EAX con el contenido de 405000 y como siempre la ventana de aclaraciones del OLLY nos da el valor de cada operando en mi caso

Al apretar F7 en este ejemplo y EAX es menor que el contenido de 405000 que es 1000, dar un resultado negativo y activara el FLAG S.

Existen en forma similar CMP AX,WORD PTR DS:[405000] Y CMP AL,BYTE PTR DS:[405000] En el caso de comparar 2 bytes o 1 byte del contenido de la memoria.

TEST (Logical Compare)

El principio de esta instruccin es, en cierto modo, el mismo de cmp, es decir, una operacin entre dos valores que no se guarda, sino que puede modificar el estado de algunos flags (en este caso, SF, ZF y PF) que determinan si debe efectuarse el salto que tambin suele acompaar a esta instruccin. La diferencia est en que en este caso, en vez de tratarse de una resta, se trata de una operacin AND. Esto nos dice nuestro amigo CAOS en su tute de ASM veremos ejemplos para aclarar la definicin, generalmente el comando TEST lo veremos en este formato TEST EAX,EAX Ustedes dirn para que quiere testearse contra si mismo el valor de EAX o el registro que sea? Pues se usa esta instruccin, para saber si EAX en este caso es cero o no, y como funciona? Escribamos en OLLY TEST EAX,EAX

La tablita de la operacin AND era

. El resultado es 1 si los dos operandos son 1, y 0 en cualquier otro caso.


1 and 1 = 1 1 and 0 = 0 0 and 1 = 0 0 and 0 = 0 Vemos que la nica forma que el resultado sea cero es que ambos operandos sean cero (no interesan en este caso los casos de bytes diferentes pues EAX esta operando contra si mismo, por lo que ambos bytes siempre son iguales) pues si EAX en binario tiene algn bit que es 1, al hacer AND contra si mismo dara 1 y ya no podra ser cero el resultado. Pongamos EAX igual a CERO

En el OLLYDBG eso sea realiza fcilmente haciendo CLICK DERECHO en el registro a modificar y eligiendo ZERO.

All esta apreto F7

Vemos que se activo el flag Z o sea como sabamos la operacin AND entre dos valores que son cero es igual a cero y se activara. Si repito la operacin con EAX diferente de cero

Apreto F7

Y el FLAG Z no se activa al ser el resultado diferente de cero. Si uso la calculadora puedo comprobar que 390 AND 390 da como resultado 390 En binario 390 es 1110010000

Como la operacin AND si ambos operandos son CEROS dar como resultado cero y si son dos UNOS dar como resultado UNO, vemos que el resultado no cambiar o sea ser 390 en hexadecimal, y no se activara el flag Z.

Hay alguna instrucciones mas de comparacin pero estas son las principales llego el momento de ver los saltos SALTOS Todos as instrucciones de salto tienen un solo operando que es la direccin adonde saltara el programa, veamos los diferentes tipos aqu en la tabla y aclarmoslos.

JMP

Es el salto directo o incondicional, aqu no hay ninguna decisin SIEMPRE saltara a la direccin que nos muestra el operando por ejemplo veamos en OLLY

Al ejecutar ese salto el programa ira a 401031 y seguir ejecutndose desde all. Tenemos un par de lindas configuraciones del OLLY para los saltos que les enseare aqu, as son mas visibles los mismos. Si vamos a OPTIONS-DEBUGGING OPTIONS

Y all en la pestaa CPU

Marcamos estas tres tildes

Vemos que la informacin es mucho mayor ahora y mas visible

Vemos que OLLYDBG ahora nos muestra con una flecha roja que va a saltar y adems a adonde va a saltar, exactamente a 401031. Si ejecuto ahora con F7

Se realizo el salto y EIP es 401031

Ya que EIP apunta a la instruccin que se va a ejecutar a continuacin, en este caso 401031.

JE o JZ Ambos son el mismo tipo de salto condicional y pueden escribirse de las dos formas ya vimos que JZ saltara cuando el flag Z sea cero.

Escribamos en OLLYDBG dos instrucciones una comparacin y el salto as verificamos como funciona. Pongo EAX y ECX iguales

Al ejecutar la comparacin se realiza la resta y como ambos son iguales se activa el FLAG Z al ser el resultado CERO.

La siguiente instrucciones es el salto condicional veamos

OLLYDBG ya nos avisa la decisin y como el FLAG Z esta activado nos muestra en rojo que va a saltar, si la indicacin estuviera en gris quiere decir que la decisin es no saltar, en este caso saltara, apreto F7.

All vemos que salto y EIP ahora es 401031. Repitamos el ejemplo con EAX diferente de ECX

Al apretar F7 en la primera instruccin como el resultado no es cero, el flag Z no se activa.

Y vemos en OLLY

Que como el JE salta si el flag Z es UNO, en este caso no saltara, y la flecha del salto esta gris, al apretar F7 nuevamente

Vemos que no salto y sigui a continuacin en 401004, esto que parece tan tonto es la base de la comparaciones y decisiones en todos los programas. Si repito el ejemplo anterior y llego al salto, nuevamente y no va a saltar

Sabemos que no salta porque el flag Z esta a cero, ahora que ocurre si hago doble click en el flag Z y lo cambio a 1.

Vemos que la flecha cambio a rojo y OLLYDBG saltara, independientemente de la comparacin, manipulando directamente el flag, ya que la decisin se toma sobre el estado actual del mismo, si cambia el flag cambiara el salto. Los otros saltos los veremos rpidamente con un ejemplo cada uno JNE o JNZ Es el opuesto al salto anterior en este caso, salta si el flag Z no esta activo o sea si el resultado de la operacin fue distinto de cero.

All escribo la comparacin y el JNZ Si EAX y ECX son iguales se activa el FLAG 0 al ser la diferencia CERO

Y al revs que el JZ que saltaba al estar el FLAG Z activo este es el opuesto, salta cuando el FLAG Z es cero o esta inactivo. Se puede entender que si pongo EAX diferente de ECX, el resultado ser diferente de cero y el flag Z quedara inactivo y all si saltara. JS Como vemos en la tabla saltara si la comparacin da un resultado negativo o sea si EAX en menor que ECX en el ejemplo anterior.

Al apretar F7

El FLAG S se pone a 1 y saltara al ser negativo,

All vemos que la flecha roja nos indica que saltara, en el caso que EAX sea mayor que ECX el flag S no se activara al ser un resultado positivo y el salto JS no saltara. JNS Es el opuesto al anterior saltara cuando el FLAG S este a cero o sea cuando el resultado sea positivo, en el ejemplo anterior cuando EAX sea mayor que ECX. JP o JPE En esta caso el salto condicional JP saltara cuando el FLAG P este activo y esto ocurrir como habamos visto cuando el resultado de la comparacin tenga paridad par o par cantidad de unos al verlo en binario.

Ponemos EAX a 20 y ECX a 18 y apretamos F7

Como la diferencia entre EAX y ECX es 2 y este pasado a binario es 10 que tiene 1 solo uno o sea una cantidad impar de unos, el flag P no se activa y el JPE no saltara.

Ahora si cambio ECX a 17 y repito apreto F7

Vemos que al ser el resultado 3 que en binario es 11 y tiene un nmero par de unos, entonces all si se activa el FLAG P y el JPE saltara.

JNP o JNPE Es el opuesto del anterior o sea este salta cuando el flag P esta a cero o sea la paridad es impar, en el ejemplo anterior hubiera saltado la primera vez cuando el resultado era 2 y no hubiera saltado cuando el resultado era 3, al revs del JP. JO

Este salta cuando hay overflow o capacidad excedida lo cual activa el flag O.

Aqu cambiamos la comparacin porque para activar el FLAG O hay que hacer OVERFLOW y esto es posible mediante una suma.

Apreto F7

Y el JO saltara al haberse activado el FLAG O por OVERFLOW o capacidad excedida. JNO Es el opuesto al anterior este salta cuando el FLAG O esta a CERO o sea no hay OVERFLOW JB Salta si es mas bajo, veamos el ejemplo

Vemos que EAX es mas bajo que ECX o sea que debera saltar, al apretar F7

El flag C se activa, ya que tiene que al hacer la diferencia que da un numero negativo, en el bit mas significativo o sea el primero habr acarreo y eso activa el FLAG C, y segn eso decide el JB en resumidas cuentas si EAX era menor que ECX. JNB Es el opuesto de JB saltara si el FLAG C es cero o sea no hay acarreo porque el resultado fue positivo, lo cual supone que EAX fue mayor que ECX y al revs que el anterior este saltara en ese caso. JBE Este salta si es mas bajo o igual o sea testea dos flags a la vez ve si el FLAG C esta activo en ese caso salta, y tambin verifica si el FLAG Z esta activo con el cual tambin salta, o sea si EAX es igual a ECX saltara y si es menor tambin.

Ponemos como primer caso que EAX y ECX sean iguales

Apreto F7

Al ver que el flag Z esta activo salta

Si EAX es menor que ECX

Apreto F7

En este caso se activa el FLAG C al ser resultado negativo que usa un carry en el bit mas significativo, o sea salta cuando EAX es menor a ECX tambin En el ultimo caso que EAX es mayor a ECX repito el ejemplo apreto F7

Ambos flags Z y C estn a cero por lo tanto no saltara

O sea la conclusos es que JBE salta si EAX es mas bajo o igual que ECX en el ejemplo. JNBE Es el opuesto al anterior, salta si el flag Z y el FLAG C son cero ambos o sea solo en el ultimo ejemplo anterior cuando EAX es mayor que ECX, all ambos flags estn a cero y este JNBE saltara. JL en este caso JL salta si es menor, pero en diferente forma, veamos aqu mira si FLAG S es diferente a FLAG O y en ese caso salta Veamos en los ejemplos cuando se da esto si ambos EAX y ECX son positivos siendo EAX mayor que ECX

Al apretar F7 no salta ya que EAX es mayor que ECX y el resultado es positivo lo que no activa el FLAG O ni el FLAG S.

Si EAX es menor que ECX pero ambos son positivos repito el ejemplo

Apreto F7

Y como S y O son diferentes salta o sea que salta cuando es menor si ambos son positivos, veamos otro caso.

En este caso EAX es menor que ECX, ya que es un nmero negativo veamos que pasa Salta perfectamente porque es menor pero que pasa si usamos estos dos mismos valores con el otro salto que parece realizar el mismo trabajo el JB

Al apretar F7

Vemos que el JB no salta quiere decir que JB compara ambos como si fueran positivos o SIN SIGNO mientras que si el salto debe considerar el signo de lo que compara se utiliza JL esa es la principal diferencia entre ambos.

Aqu vemos en esta los saltos condicionales segn queramos considerar el signo de lo que comparamos o no, Vemos que JA, JB JBE y JAE consideran ambos operandos positivos mientras que JG, JL, JLE y JGE consideran los operandos con signo, JE y JNE se comportan igual en ambos casos. Creo que con esto hemos aclarado el tema de los saltos condicionales y las comparaciones, en la prctica mas adelante veremos su utilizacin en los programas lo cual nos ser mucho mas liviano que esta pesada tarea de revisarlos a casi todos. Queda en la ultima parte de ASM por suerte ver los calls y ret, y los modos de direccionamiento ya casi llegamos al fin de lo duro paciencia jeje..

Hasta la parte 7 Ricardo Narvaja 16 de noviembre de 2005

INTRODUCCION AL CRACKING CON OLLYDBG Parte 7

Los CALL y RET He dejado algunas instrucciones para esta ultima parte porque creo que a esta altura ya tienen claro algunas cosas, y es mejor explicar estas ultimas instrucciones ya teniendo una pequea base, ahora explicaremos los CALL y RET. Esta instruccin aunque parezca su funcionamiento sencillo, muchos de los newbies no comprenden realmente su funcionamiento, por eso quera dedicarle un espacio importante e insistir en repasar toldo lo anterior, pero ademas mirar de entender muy bien el funcionamiento de los CALL y RET yo creo que es algo muy importante para el cracking. Carguemos nuevamente nuestro crackme de ejemplo el CRACKME DE CRUEHEAD en OLLYDBG, Para practicar hagamos click derecho en el listado desensamblado en cualquier lnea y elijamos GO TO EXPRESSION

Y en la ventana que aparece tipeemos 401245

Nos llevara a dicha direccin en el listado desensamblado, donde hay un CALL para practicar.

All vemos el CALL que eleg para practicar, para poder ejecutarlo hago CLICK DERECHO-NEW ORIGIN HERE con lo cual EIP apuntara a 401245 y dicha direccin ser la prxima que se ejecutar.

All vemos como cambiamos EIP

Volvamos a nuestro CALL

La instruccin CALL lo que hace es ir a ejecutar una subrutina o si quieren parte del programa cuya direccin esta dada por el valor del operando o sea en este caso del ejemplo: CALL 401362 significa que la prxima lnea a ejecutarse ser 401362 y cuando se termine de ejecutar la rutina que esta all dentro, volver a la instruccin siguiente a continuacin del CALL que la llamo. En este ejemplo luego de ejecutarse el contenido del CALL 401362, volver a 40124A y seguir desde all. Ahora hagamos unos ciertos movimientos con el OLLYDBG, que nos ayudan en los casos que estamos encima de un CALL como este. Si yo quiero mirar el contenido del CALL podra entrar al mismo con F7 y tracearlo por dentro, pero si quiero echar un vistazo a ver si el contenido me interesa para ser traceado o no, ya que tambin tengo como recuerdan la opcin de tracear con la tecla F8, la cual en este caso ejecutara el CALL sin entrar al mismo y seguir en 40124A sin ni siquiera enterarnos de lo que hizo el programa dentro del CALL.

Entonces cada vez que llegamos a un CALL y estamos traceando un programa se plantea una disyuntiva, ser importante para entrar a tracearlo con F7? O lo salteo con F8 porque es un call secundario que no hace nada que me importe? Bueno, lo que OLLYDBG nos permite hacer es mirar sin ejecutar, a ver que veo dentro del CALL y si me interesa. Para ello hago click derecho en el CALL y elijo FOLLOW.

FOLLOW no ejecuta ninguna lnea solo va a mostrarnos la prxima lnea a ejecutarse, pero no cambia nada EIP seguir en 401245, a la espera de nuestra decisin.

Cuando entro a mirar veo la rutina interna que obviamente empieza en 401362 que era el operando del CALL y donde terminar, pues en el primer RET que vea en este caso OLLYDBG escribe los RET como RETN, pero es lo mismo dicha instruccin es la finalizacin de la rutina y la vuelta a 40124A a la instruccin siguiente del CALL que nos trajo aqu. Es muy importante entender esto, ahora que vimos como podemos mirar dentro sin ejecutar volvamos a la lnea actual presionando la tecla - del teclado numrico o sea la tecla MENOS, esto siempre nos lleva al paso anterior sin ejecutar nada tambin. Pues estamos en el CALL

Ahora si entraremos con F7, pero antes de entrar el CALL veamos el stack, esto es muy importante pues all se almacenan los datos para que el programa sepa donde regresar cuando llega al RET.

En mi maquina este es el stack, en la suya los valores pueden variar pero el mecanismo ser similar. Apreto F7 ahora

All entre en el CALL y estoy en 401362 pero a diferencia de la vez anterior que entre con FOLLOW ahora EIP cambio a 401362, lo cual quiere decir que estamos ejecutando esta rutina. Veamos que paso en el stack

All en la imagen resalte el stack como estaba antes y veo que se agrego una nueva carta arriba o sea al entrar en un CALL el sistema automticamente hace un PUSH con la direccin de retorno, o sea donde volver al llegar al RET y salir de la rutina. Vemos que la lnea tiene el valor 40124A que es como sabemos la direccin de retorno. Por si alguno lo olvido recordemos que es la direccin siguiente al CALL inicial, all se ve.

Bueno vemos que OLLY nos aclara aun mas el tema agregndonos informacin.

Nos dice RETORNO A 40124A desde 401362 O sea OLLY aun no sabe donde estar el RET que nos devolver, pero sabe que la rutina empieza en 401362 y lo marca como que aqu empieza y terminara en un RET y volver a 40124A. Apretemos F7 una vez vemos que ejecuta un PUSH 0 lo cual pone un CERO en el stack y abajo del mismo queda el indicador para el RET de la direccin de retorno.

El programa puede hacer mil operaciones dentro de la rutina hacer miles de PUSH, POPS lo que quiera, pero al llegar al RET deber dejar arriba en el stack nuevamente el valor de la direccin de retorno, sigamos ejecutando con F8 para no entrar en los CALL y llegar al RET.

All llegue al RET y veo que como dije el stack tiene arriba nuevamente el valor donde retornara.

Como habamos mencionado el RET es el final de la rutina y contrapartida de la instruccin CALL, si CALL nos trajo aqu, RET nos devolver a la zona donde estbamos antes de entrar en esta rutina. Pero adems RET quitara la direccin de retorno del stack que es un valor que al sistema ya no le interesa pues ya volvemos y luego la direccin ya no es til ms.

Apreto F7

Y vuelvo a 40124A y el stack quedo como estaba antes de ejecutar el CALL en mi maquina en 12FFc4.

Es de mencionar que si uno ejecuta un RET sin haber entrado en ningn call por ejemplo PUSH 401256 RET Lo que har esto es poner en el primer lugar del stack el valor 401256, y como la siguiente instruccin es un RET, pues ella interpreta que el primer lugar del stack es una direccin de retorno de algn call anterior y aunque ello no haya ocurrido, al ejecutarlo nos llevara all. Ahora reinicio el CRACKME DE CRUEHEAD Ahora har otro ejemplo voy en el listado con GO TO EXPRESSION a 401364 es una direccin que eleg para mostrar algo ya vern.

Ahora no cambiare EIP ni nada si no que apretare F2 que es un BREAKPOINT los cuales ya explicaremos mas adelante en detalle, lo importante es que cuando el programa ejecute esa instruccin OLLYDBG parara all.

All esta puesto el BREAKPOINT ahora apreto F9 que es RUN para que el programa corra.

Vemos que nos sale la ventana del crackme, si no la ven, pues bsquenla con ALT mas TAB entre los programas que estn corriendo. All se ve, el programa no paso aun por nuestro BREAKPOINT, vayamos en dicha ventanita a HELP REGISTER

Nos sale la ventana para poner un NOMBRE Y UN SERIAL

Pongamos cualquiera

Y apreto OK

Nos sale una ventanita diciendo que no tuvimos suerte o sea que tipeamos el user y serial incorrecto (lo increble seria que fuera el correcto jeje), y al aceptar dicha ventana para en nuestro BREAKPOINT. Si no les para prueben con el user y serial que puse yo.

All estamos en el medio de la ejecucin del programa pero algo de informacin tenemos

Vemos all unos cuantos RETURN TO . Que el stack tiene almacenados all, as que podemos pensar que el superior de todos, ser donde volver el programa al llegar a un RET ya que suponemos estamos dentro de un CALL (porque vemos que hay RETURN TO en el stack ) y al llegar a un RET ese RETURN quedara en la lnea superior y volver a 40124A . Como vemos tambin estamos en la misma rutina que analizamos antes cambiando el EIP, pero ahora dentro de la ejecucin el programa, no suelta. Tratamos de llegar al RET apretando F8 como antes, en el call anterior al RET se para ya que nos debe mostrar algo que hace el CALL dentro que es una mensaje y que debemos aceptar para seguir.

Presionamos ACEPTAR

Y llegamos al RET y como supusimos el valor superior del stack es

La diferencia entre la vez anterior y esta es que la vez anterior al cambiar EIP e ir directamente all, ejecutamos el CALL solo aislado, no el resto del programa, ahora al poner un BREAKPOINT el programa se ejecuto normalmente, y al pasar por all paro, y si apreto F9 seguir corriendo como si nada.

Adems lo que quise mostrar es que a veces cuando estamos en el medio de la ejecucin de un programa y paramos por algn motivo, la informacin del stack nos sirve para saber de donde fue llamado la rutina en que estamos y donde volver, y si hay mas RETURN TO hacia abajo, tambin sabremos que son CALLS unos dentro de otros, o sea anidados, y que estamos dentro de un CALL que al llegar al primer RETURN TO, saldremos y al llegar al segundo pues saldremos de otro y as. Creo que esta claro, igual como es muy importante que entiendan esto aclararemos con otro ejemplo reiniciemos el OLLY y apretamos la barra espaciadora y escribamos como primera lnea solo para entender esto CALL 401245

Alli esta ahora podemos practicar hacer FOLLOW para la rutina por dentro

Vemos que como modificamos el programa la rutina ahora empieza en 401245 y terminara en el RET de 401288 (que es un RETN10 un poco diferente a un RET comn, pero no es eso el tema de esta explicacin ya lo veremos mas adelante lo que quiero que vean es lo que pasa cuando entramos en un call como en este caso y dentro de la rutina entramos en un segundo CALL. Bueno ya hicimos FOLLOW y miramos ahora apretemos MENOS para volver y ahora si apretemos F7 para entrar ejecutando.

All estamos y EIP apunta a 401245 que es la prxima instruccin a ejecutarse

Y en el stack vemos que en el primer lugar esta el valor de retorno a la lnea siguiente del call que escribimos a mano.

Vemos que el valor esta, pero OLLYDBG no nos aclaro RETURN TO 401005, porque ocurre esto, es bueno entenderlo para saber como funciona OLLYDBG, como nosotros agregamos el CALL despus del anlisis inicial que el OLLYDBG haba hecho, pues de esta forma, le hemos cambiado el caballo en el medio del ro y lo hicimos ahogar jeje, por lo cual si queremos arreglarlo, debemos hacer en el listado en cualquier lnea CLICK DERECHO- ANALICE CODE, con lo cual lo volver a pensar despus de los cambios que hemos introducido.

Vemos que despus de reanalizar el cdigo

Bueno nos dijo que volver a MODULE ENTRY POINT + 5

Dicho valor es 401000 que era el ENTRY POINT mas 5 =401005 Es muy importante esto porque muchas veces uno le dice a una persona que le pide consejo, fjate los RETURN TO en el stack, pero resulta que uno mismo ha modificado cosas o el mismo programa se ha auto modificado al ejecutarse entonces el anlisis inicial del OLLYDBG fallara en las aclaraciones y debemos actualizarlo al detenernos, o quitar el anlisis como vimos si nos trae problemas en la parte 1. Bueno aclarado esto volvemos a donde estbamos

Apreto F7 para entrar en el segundo CALL

Vemos que arriba de donde guardo la direccin de retorno del primer call ahora guarda la segunda direccin de retorno de este, en este caso estn consecutivos, pero podra haber valores numricos intermedios productos de PUSH o operaciones diversas, lo importante es que el primer RETURN TO .. que hallamos de arriba hacia abajo es la direccin de retorno del ultimo CALL que entramos y la segunda que hallemos bajando ser la direccin de retorno del call anterior que es el inicial que escribimos. Esta es la idea de calls anidados o uno dentro de otro, si yo por poner un BREAKPOINT o por algn motivo parara aqu en el medio de la ejecucin del programa, aunque no haya venido traceando ni tuviera informacin de cmo se vino ejecutando el programa al ver el stack , puedo sacar como conclusin 1) CAI AQU Y VEO UN RET un poco mas abajo, supongo que estar dentro de un CALL para confirmarlo miro el stack

2) MIRO EL STACK

Al mirarlo y buscar desde arriba del stack hacia abajo y hallar el primer RETURN TO se que el programa al llegar al RET volver a 40124A.

Y adems de saber donde volver se que estoy dentro de la ejecucin del CALL ANTERIOR al punto de retorno, o sea que el programa llamo a la zona donde estoy desde 401245 usando un CALL que llama a la rutina de 401362. Y no solo se eso si no que se tambin que antes de llegar a ese CALL, haba entrado antes en otro ya que hay otro RETURN TO . Mas abajo

Ese me informa que luego de ejecutar todo saldr a 401005 y adems se que el programa provena del CALL de la lnea anterior o sea

Solo parando y mirando el stack ya determine que el programa provino de aqu que entro en ese call, luego fue a 401245, all haba otro call que me llevo a 401362 y de esa forma llegue a la zona donde estoy. Esa forma de pensar en el cracking es muy til porque me hace reconstruir la forma que el programa fue llegando a cierto punto, que muchas veces no son dos calls uno dentro de otro si no que hay 30 calls uno dentro de otro y uno no puede tracearlos todos, as que si caigo en un punto, puedo hacer un anlisis personal, y llegar a la conclusin de cmo el programa arribo al punto donde me encuentro en este momento. Espero que haya quedado claro, lo de los CALL Y RETS les sugiero practicarlos repasarlo, si tienen dudas preguntar porque esto es muy importante, iba a terminar a continuacin con los mtodos de

direccionamientos y algunas instrucciones que quedaron en el tintero, pero preferira que le den buena importancia a entender esto y en la prxima parte continuamos con los temas pendientes. Hasta la parte 8 Ricardo Narvaja 18 de noviembre de 2005

INTRODUCCIN AL CRACKING EN OLLYDBG PARTE 8


Trataremos en esta parte de ver rpidamente algunas instrucciones importantes para el cracking que nos quedaron en el tintero para terminar con las mismas y empezar a crackear. INTRUCCIONES PARA LOOPS O CICLOS Ciertamente se pueden realizar ciclos en un programa con las instrucciones ya vistas o sea ejecutando varias instrucciones, poniendo un contador por ejemplo en ECX y al final una comparacin de si es cero y un salto condicional que si no es cero vuelva a repetirse el ciclo se disminuya ECX y as se repetir hasta que ECX sea cero seria algo as: Xor ECX,ECX Add ECX,15 Eso seria para inicializar el contador de nuestro loop que sera puesto a 15, aqu comienza el LOOP en si

DEC ECX Para disminuir ECX cada vez que se ejecute el loop Luego la ejecucin de las instrucciones que se deben repetir Y luego TEST ECX,ECX JNE salta hacia el inicio del LOOP O sea que al testear si ECX es cero la primera vez ser 14 ya que lo decremente una vez y al no ser cero volver a repetirse, y as se repetir hasta que ECX sea cero donde saldr fuera del LOOP y continuar con la instruccin siguiente. Escribmoslo en OLLYDBG

All lo vemos la zona resaltada en amarillo es el loop en si, que se repetir hasta que ECX sea cero, y entre 401008 y 40100C se deberan escribir las instrucciones que el programa desea repetir que aqu no interesan pues solo vemos el mecanismo de iteracin del LOOP por eso dejamos NOPS alli. Si lo traceamos vemos que al apretar F7, ECX se pone a cero

Apreto F7 nuevamente y le sumo 15 para establecer la cantidad de iteraciones en ECX.

Luego apreto f7 hasta llegar al DEC ECX el cual al ejecutarlo pone ECX en 14 Luego llegamos hasta la comparacin TEST ECX,ECX que sabemos que verifica si ECX es cero

Al no ser cero no se activa el FLAG Z y el JNZ salta hacia 401007, donde vuelve a decrementar ECX quedando en 13, puedo tracear as haciendo los loops hasta llegar al momento que ECX vale CERO Vemos que al ejecutar la comparacin con ECX igual a cero se activa el FLAG Z lo que hace que el JNZ no salte

Recordemos que JNZ es el inverso de JZ que saltaba cuando se activaba el FLAG Z, el JNZ es el opuesto no salta cuando se activa el FLAG Z.

All lo vemos la flecha en gris indica que no va a saltar, al apretar F7 nuevamente sale del loop a la instruccin siguiente

Esa seria una forma sencilla de loop con las instrucciones ya vistas, aunque hay instrucciones especiales para eso. LOOP La instruccin LOOP nos ayuda a hacer algunas de las tareas que vimos en el ejemplo anterior, reemplazamos

En donde estaba DEC ECX hacemos CLICK DERECHO BINARY NOP con los cual NOPEARA esa instruccin, lo mismo donde estaban TEST ECX,ECX y JNZ 401007, todas esas instrucciones pueden ser reemplazadas por una sola que es la INSTRUCCIN LOOP la cual compara si ECX es cero, si no lo es salta al operando en este caso 401007 y adems decrementa ECX . Hagamos en la primera lnea, CLICK DERECHO-NEW ORIGIN HERE para ejecutar mi nuevo LOOP. Vemos que al apretar f7 pone ECX a cero luego le suma 15 igual que antes para marcar la cantidad de iteraciones o repeticiones. Ahora traceo y llego hasta la instruccin LOOP

Vemos que igual que antes al no ser ECX igual a cero, salta a 401007, pero no solo compara si es cero y salta, tambin vemos que decrementa ECX ya que volvi siendo 14. Si traceamos hasta que llega a LOOP pero valiendo ECX igual a cero veremos como se repite el ciclo.

En el momento que ECX vale cero ya no se repite mas el LOOP y al apretar F7 continua con la ejecucin de la instruccin subsiguiente.

Luego tenemos variaciones de la instruccin LOOP estas son

LOOPZ salta o mantiene dentro del bucle mientras que el flag Z sea cero cada vez que se ejecute la instruccin LOOP, y la opuesta LOOPNZ mientras que el FLAG Z sea 1, en este tipo de ciclo hay ademas contador que se decrementa y se sale por alguna comparacin anterior que ponga el FLAG Z a cero en el primer caso o a 1 en el segundo o porque ECX llegue a cero por cualquiera de ambos casos. INSTRUCCIONES PARA EL MANEJO DE CADENAS de BYTES Aqu vemos las mas importantes las aclaramos debajo MOVS Esta instruccin, lo que hace es mover el contenido de ESI al contenido de EDI, realmente no necesita ningn parmetro, pero al escribir en OLLY la instruccin MOVS y apretar ASSEMBLE, la completa (innecesariamente) al ensamblar y queda como

MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] All vemos el ejemplo que escrib

Inicializo antes ESI con la direccin de donde se va a leer o ORIGEN y EDI con el DESTINO o donde se copiar Podemos mirar en el DUMP el contenido de ambos para ver como va a ser cuando lo ejecute En el DUMP puedo hacer GOTO EXPRESIN=40366C o bien lo mismo y mas rpido FOLLOW IN DUMP- INMEDIATE CONSTANT que mostrara en el dump la constante 40366C

All vemos los bytes que apunta ESI o sea los de ORIGEN o que van a ser copiados. Y EDI apunta a

All deberan copiarse seria el DESTINO. Si apreto F7 hasta que ejecuto el MOVS vemos que se copiaron los 4 bytes.

As mismo como el comando MOVS mueve los 4 bytes o sea el DWORD, tambien existe MOVSW (mueve 2 bytes) y MOVSB (mueve un solo byte) en la misma forma que funciona MOVS. REP Es un prefijo que se agrega a ciertas instrucciones como la anterior y que significa que la instruccin se repetir hasta que ECX sea cero, a la vez que cada vez que se ejecute la instruccin se decrementara ECX en uno y aumentaran ESI Y EDI en 4 para apuntar a los siguientes 4 bytes. Es muy util para copiar grandes cantidades de memoria de una zona del programa a otra. Modifiquemos el caso anterior y agregumosle el REP

Adems modifique la direccin de ORIGEN a 40365C para que copie desde all, la direccin de destino sigue siendo 40369C, voy a la primera lnea con NEW ORIGIN HERE y llego apretando F7 hasta el REP

La aclaracin del OLLY nos muestra las direcciones de ORIGEN Y DESTINO y los contenidos que copiara, apreto F7

All se copiaron los 4 primeros bytes, pero no salimos de la instruccin ya que la misma se repetir hasta que ECX sea cero y vemos que ahora ECX es 3, o sea disminuyo en uno, adems ESI y EDI se incrementaron en 4, para apuntar a los 4 siguientes bytes.

Apreto F7 nuevamente

All se copiaron los siguientes 4 bytes y ECX quedo en 2

Si sigo apretando F7 una vez mas ECX ser 1

Y nuevamente

Vemos que dejo de repetir y paso a la siguiente instruccin ya que ECX vale cero.

Vemos como se copiaron los bytes del ORIGEN al DESTINO y que se repiti 4 veces la operacin gracias a la instruccin REP. Es de aclarar que esta vez, busque una seccin de destino con permiso de escritura ya que si no fuera as, como en veces anteriores al ejecutar la instruccin nos dara una excepcin. Adems de la instruccin REP existen variantes como REPE o REPZ que repite hasta que el flag Z se pone a cero y REPNZ repite hasta que el flag Z no sea cero, o si ECX es cero tambin sale por cualquiera de las dos posibilidades, aunque estas variantes de REP no sirven para el caso de la instruccin MOVS si no para otras que veremos a continuacin.

LODS Esta instruccin lo que hace es mover los bytes que apunta ESI, o sea su contenido a EAX

Vemos en este ejemplo que al llegar a LODS (que OLLY escribe como LODS DWORD PTR DS:[ESI]) Y vemos que ESI apunta a 40365C lo cual vemos en la aclaracin del OLLY

Y en el DUMP miramos

Esos son los 4 bytes que mover a EAX, apreto F7.

Al ejecutar con F7, vemos que EAX tomo ese valor.

Tambin a LODS se le puede agregar delante el REP y como en el caso anterior repetir hasta que ECX sea cero, y leer a partir de ESI los bytes, y los movera a EAX. Al llegar a REP LODS

Nos muestra los bytes que apunta ESI y que sern transferidos a EAX si apreto F7

ECX se disminuyo a 3 y ESI se incremento 4 para apuntar a los siguientes 4 bytes que se movern a EAX y as se repite hasta que ECX vale cero y sigue ejecutando la siguiente lnea. Tambin existen las versiones para copiar 2 bytes LODSW y para copiar 1 byte LODSB STOS En este caso COPIA al contenido de EDI, el valor que hay en EAX.

Al ejecutar este ejemplo y llegar a STOS

Nos muestra EAX y el destino EDI en su contenido se copiaran. Al ejecutar

All se copiaron al DESTINO, tambin al igual que los casos anteriores se le puede agregar REP delante para repetir y existen STOSW y STOSB para copiar dos bytes o un solo byte. CMPS Compara el contenido de ESI con el contenido de EDI

OLLY la escribe como CMPS DWORD PTR DS:[ESI],DWORD PTR ES:[EDI] Si llego traceando con F7 hasta el CMPS la aclaracin del OLLY nos muestra lo que va a comparar

Como la comparacin en si sabemos que es una resta de ambos y como en mi caso son iguales el resultado es cero y activa el FLAGZ

En este caso si se puede utilizar REPE o REPZ que comparara hasta que el FLAGZ sea cero o ECX sea cero en cualquiera de ambos estados saldr del REPE.

En mi caso, de anteriores ejemplos haba quedado en 40365C y 40369c lo que vemos en mi DUMP. Y escribo, poniendo ECX a 10 ya que en todos los casos al llegar ECX a cero teminar la repeticin, solo que en el caso de REPE, tambin finalizara segn el estado del FLAG Z.

Llego hasta el REPE apretando F7 y en mi caso ambos operandos son iguales por lo cual la diferencia ser cero y se activara el FLAG Z .

Vemos que para REPE si el FLAG Z esta a 1 o sea son iguales no nos saca de la repeticin, apreto F7 Si seguimos apretando llega el momento en que ambos operandos son diferentes

En ese caso al apretar F7 el FLAG Z se pone a 0 y sale de la repeticin

Si hubiramos llegado a ECX igual a cero, siempre comparando operandos iguales, en ese caso saldra al ser ECX igual a cero tambin. Como habamos dicho existe tambin el REPNZ que salta al ser el flag Z igual a 1 o sea cuando en la comparacin ambos operandos son iguales. Creo que con esto hemos hecho un estudio bastante detallado de las instrucciones mas importantes, solo dejamos para mas adelante las instrucciones de PUNTO FLOTANTE para no complicar por ahora la cosa, espero que lo hayan entendido y que practiquen cada instruccin hasta que sepan bien que hace sin dudar. MODOS DE DIRECCIONAMIENTO DIRECTO: Es el modo ms comnmente utilizado, para referirnos a una direccin de memoria, en la instruccin escribimos su valor. mov dword ptr [00513450], ecx mov ax, word ptr [00510A25] mov al, byte ptr [00402811] CALL 452200 JMP 421000

En este caso no tenemos ningn problema de interpretar cual es la direccin de memoria donde el programa guardara, mover, saltara o ejecutara una rutina pues esta a la vista. INDIRECTO:

mov dword ptr [eax], ecx CALL EAX JMP [ebx + 4] Estas instrucciones si las vemos aqu no nos dicen en que direccin se guardaran, o donde saltara o estar la rutina del CALL, solo estando parado debuggeando con OLLYDBG justo en esa instruccin y viendo los valores que en ese momento tienen los registros, se podr saber y OLLYDBG nos los mostrara en la aclaracin cual es la direccin.

En muchos programa se utiliza el direccionamiento indirecto como una forma de complicar el trabajo del cracker ya que el anlisis que OLLYDBG hace al inicio del programa, no nos dar informacin de estas instrucciones ya que hasta que no llegue a ejecutarlas no sabr cual es el valor circunstancial de los registros. Solo poniendo un BREAKPOINT o llegando traceando hasta alguna de estas instrucciones, en dicho punto se sabr el valor de la direccin, hagamos un ejemplo, reiniciemos el OLLYDBG con el crackme de cruehead

All vemos un PUSH [ebp+8] Como estoy en el inicio o ENTRY POINT del programa no se cuanto valdr EBPcuando llegue a esa instruccin, por lo cual no tengo ni idea de que pusheara all, voy a la lnea con GOTO EXPRESIN 401009 y apreto F2 para colocar un BREAKPOINT. Luego apreto F9 que es RUN y parara en el BREAKPOINT al pasar por alli.

All paro y OLLY en la aclaracin nos muestra que en mi maquina EBP+8 es 12FFF8 ya que EBP vale en este momento 12FFF0 al sumarle 8 dar 12FFF8 en mi maquina, en la suya puede tener otro valor pero ser igual siempre a EBP+8.

PUSH [ebp+8] es hacer PUSH el contenido de 12FFF8 si veo en el DUMP dicha posicin de memoria con GOTO EXPRESIN 12FFF8

Y el contenido ser

Por lo cual ese ser el valor PUSHEADO si apreto F7 veo que lo coloca en el stack

El mismo caso se da en cualquier instruccin indirecta solo podemos calcular las direcciones que utilizara al estar justo ejecutando dicha instruccin. Existen otros Modos de direccionamiento pero en cierta forma ya fueron explicados junto con las instrucciones por lo cual no repetiremos ni agregaremos mas nada. Creo que el que sobrevivi a todo lo anterior y lo entendi bien tiene grandes probabilidades de xito en el mundo del cracking no sin antes practicar y leer mucho pero, lo anterior es lo bsico, a partir de la parte 9 ya ingresaremos en el apasionante mundo de la practica del cracking, por favor repasen bien las 8 partes estas a FULL. Hasta la parte 9 Ricardo Narvaja 20 de noviembre de 2005

INTRODUCCION AL CRACKING CON OLLYDBG PARTE 9


Bueno ya hemos terminado de explicar las instrucciones assembler y ahora se nos presenta una disyuntiva, por donde seguir, hay muchsimo que aprender y practicar, por lo cual trataremos de ir como siempre pasito a pasito, sin apuros usando lo que aprendimos, y agregando mas cosas que faltan aun. Por supuesto nuestra primera victima ser el famoso CRACKME DE CRUEHEAD pero no nos limitaremos solo a ir viendo las distintas formas de crackearlo, si no tambin que nos iremos ubicando con conceptos que luego nos sern bsicos a la hora de profundizar en el arte. Abramos el famoso crackme en OLLYDBG y orientmonos un poco antes de empezar. Veremos en el mismo crackme algunas definiciones que son tiles para cualquier programa. ENTRY POINT: Es la primera lnea que se ejecuta del programa normalmente, no confundir con OEP (Original Entry Point) que es otra cosa que definiremos en partes posteriores de esta introduccin, o sea si abrimos un programa en OLLYDBG, este para y lo analiza, all donde termina de analizar y queda detenido es el ENTRY POINT del programa.

En nuestro caso del Crackme de Cruehead, el ENTRY POINT ser 401000 y OLLYDBG nos muestra en el margen inferior que normalmente usa para avisarnos porque esta detenido un programa, que en este caso estamos detenidos en el ENTRY POINT.

Casi todos los programas (el 99 %), cuando arrancan en OLLYDBG se detienen en el ENTRY POINT, los que no lo hacen es porque tienen alguna modificacin especial realizada para evitar que pare en el mismo, ese tipo de trucos veremos mas adelante, pero la idea es saber esto. Otro concepto que necesitamos y que usaremos en el de DLLs y sus APIS

Vemos que en ciertos puntos del programa el mismo nos muestra una CALL o JMP que salta en vez de a una direccin como normalmente vimos por ejemplo CALL 401020 o JMP 421367, en la imagen anterior vemos que el call por ejemplo es CALL LoadIconA Y a la derecha nos muestra cierta informacin, pero que es en este caso LoadIconA? El sistema WINDOWS utiliza para evitar que los programadores repitan las mismas rutinas que en casi todos los programas son usadas, un sistema de archivos de extensin DLL que son archivos ejecutables, pero adems tienen la propiedad de tener FUNCIONES DE EXPORTACION O APIS que no son mas que funciones que pueden ser utilizadas por cualquier programa, para tener que evitar repetir lo mismo en todos los programas. As en este caso llama a la DLL user32.dll y ella tiene una funcin denominada LoadIconA, que realizara cierto trabajo para facilitarme la programacin. El caso mas sencillo de entender es la api MessageBoxA Si en la commandbar del OLLYBD tipeo

Nos muestra la direccin de dicha api, si voy a mirar a dicha direccin en el listado haciendo CLICK DERECHO y copiando la direccin que salio en sus maquinas ya que puede variar en cada una.

All tipeo la direccin que en mi maquina apareci

USUARIOS DE WINDOWS 98 no hace esto ya vern porque

All vemos que pertenece a la dll llamada USER32.dll y que no es mas que una rutina que termina en un RET, lo nico que nos salva esto es de tener que agregar toda esta rutina en nuestro programa, as se hacen programas mas pequeos y se nos facilita la vida a los crackers jeje. Si apreto la tecla MENOS volver al punto donde estaba anteriormente y puedo verificar tambin que si hago GOTO EXPRESIN y directamente tipeo MessageBoxA en dicha ventana nos lleva al mismo lugar,

All vemos la rutina de la api MessageBoxA correspondiente a USER32.dll Como vern tuve que tipear MessageBoxA y no messageboxa ya que el nombre de la api es reconocido por OLLYDBG si tipeamos en forma correcta sus maysculas y minsculas, y la pregunta siguiente es pensar como se como se escribe una api cuales son maysculas y minsculas en su nombre, pues es sencillo. Volvamos con MENOS al ENTRY POINT

Haciendo en el listado CLICK DERECHO-SEARCH FOR NAME (label) in CURRENT MODULE nos dar la lista de Apis o NAMES utilizadas por este CRACKME DE CRUEHEAD.

Para encontrar la que quiero no necesito bajar y buscarla a mano solo en esta ventana apretando la M

Vemos que el cursor se acomoda en la primera api que empieza con M si a continuacin sigo tipeando letras del nombre de la api,

Arriba nos va marcando las letras que tipeamos y el cursor halla la api

Si hago click derecho encima del nombre de la api tengo diferentes opciones

Si elijo FOLLOW IMPORT IN DISSASSEMBLER nos llevara a la direccin de la api, este es otro mtodo para llegar a la direccin, si no tenemos ganas de tipear en la comandbar.

Aqu vemos un comn error que cometen muchos que recin se inician, si all en la api hago SEARCH FOR NAME (LABEL) IN CURRENT MODULE

OLLYDBG buscara en este caso las APIS o NAMES correspondientes a USER32.dll ya que all lo especifica busca en el MODULO que esta visible en el listado, CURRENT MODULE y el que esta visible cuando estamos en la api es USER32.dll lo podemos ver en el mismo OLLYDBG arriba

Aun cuando nosotros no estemos ejecutando en este momento la api y solo mirando al buscar NAMES saldran las de USER32.dll que no son las que en este momento nos interesan, por lo tanto si queremos volver a ver las apis del Crackme de Cruehead debemos apretar MENOS hasta volver a ver el listado del CRACKME por ejemplo en el ENTRY POINT y all si, si hacemos SEARCH FOR NAMES nos mostrara las apis del mismo. PARA WINDOWS NT/2000, XP o 2003 A PARTIR DE AQU EL TUTORIAL CONTINUA PARA SISTEMAS NT/2000 y XP, les recomiendo a los que tienen WINDOWS 95 o 98 pasarse a cualquiera de esos sistemas, que all es donde OLLYDBG es mas potente, pero si no pueden hacerlo salteen esta parte y vayan a donde dice APENDICE PARA WINDOWS 98

Vemos que cuando estoy en la lista de apis del crackme otra opcin es poner un BREAKPOINT en dicha api, asi cuando el programa llama a la misma parara, hagmoslo con CLICK DERECHO-TOGGLE BREAKPOINT ON IMPORT. Tambin podramos hacerlo directamente en la commandbar tipeando Bp MessageBoxA

Si ahora vemos la direccion de la api apreciamos que se ha puesto un BREAKPOINT en la direccin de inicio de la misma, de esta forma si la api es usada parara OLLYDBG en ella, apretemos F9 para correr el CRACKME DE CRUEHEAD y ver si para alli.

Vemos que aparece la ventanita y aun no paro vayamos a HELP-REGISTER

En la ventana tipeemos algn nombre y serial falso y apretemos OK Vemos que el OLLYDBG paro veamos porque En la esquina inferior derecha vemos que esta PAUSADO

Y en la esquina inferior izquierda siempre nos muestra el motivo porque paro.

All dice BREAKPOINT en USER32.MessageBoxA o sea que paro en nuestro BREAKPOINT en la API.

Vemos que OLLYDBG nos muestra informacin ya que cada api se llama con determinados parmetros que se pasan al stack antes de llamarla, y en este caso vemos

En la primera lnea la direccin de retorno del CALL que nos hizo llegar aqu en este caso 4013C1

Como vimos cuando explicamos CALL Y RET siempre se pasa al stack la direccin de retorno del mismo, y all esta cuando llegue al RET de la api volver a 4013c1. Luego abajo los parmetros de la misma nos muestran entre otras cosas ya que la api MessageboxA es la encargada de mostrarnos los tpicos cartelitos de mensajes de Windows, el titulo del mensaje, el texto, el estilo etc. Ya vemos que el TEXTO es NO LUCK THERE, MATE que es el cartel que coloca el Crackme de Cruehead cuando el serial que introdujiste no es correcto. Pues all estamos y el crackme esta a punto de mostrarnos el fatdico cartelito.

Para que vean que no le miento y que la api es la encargada de hacerlo, pongamos un BREAKPOINT en el RET 10 que es el final de la api, all lo vemos debajo, en su maquina puede cambiar pero siempre es el primer RET a partir de la direccin de inicio de la api que vemos al ir bajando.

All tenemos la api cercada apretemos F9 o RUN.

All vemos el tpico cartelito de la MessageboxA y como nos aviso OLLYDBG el titulo es NO LUCK! Y el texto NO LUCK THERE MATE! o sea que no tuvimos suerte con nuestro serial. Por supuesto al aceptar para en el RET de la api

Como vimos el proceso de aparicin del cartel, ocurri entre el inicio y final de la api, all estamos en el RETN10. Ya que no aclaramos la diferencia entre en RETN 10 y el RET comn lo haremos aqu en este caso si el RET fuera comn, al ejecutarlo, volvera a la direccin de retorno 4013C1

Y al quitar el valor de la direccin de retorno de arriba del stack, este quedara en mi caso en 12Fe90, en el caso del RETN10 vuelve a la misma direccin 4013C1, pero a ESP se le suma 10 con lo cual el stack debera quedar en 12fe90 mas 10 seria esp=12fea0 veamos apretemos F7. RETORNO DEL APNDICE PARA WINDOWS 98 desde aqu sigue para todos los SO.

All retornamos de la api al crackme y vemos que en el stack se cumpli lo que mostramos el RETN 10 le suma a ESP 10 mas de lo que valdra si retorna como RET solo.

La cuestin es que la decisin ya fue tomada y nosotros estamos en el horno, ya nos dijo mala suerte amigo, el serial que tipeaste no sirve. Apretemos F9 nuevamente

Vemos que para nuevamente en la api, y que por si no me di cuenta me va a decir que no tuve suerte jeje

Vemos que en este caso la dileccin de retorno es 40137d veamos que hay all con GOTO EXPRESIN 40137D en el listado o bien en la primera lnea del stack CLICK DERECHO- FOLLOW IN DISASSEMBLER

Alli vemos que volveria a 40137D y que estamos dentro del call que llama a MessageboxA que esta justo arriba en 401378.

Vemos arriba que hay otro MessageBoxA pero con el mensaje de felicitacin de que acertamos GREAT WORK, jeje si pudiramos llegar all en vez de al cartel de que no tuvimos suerte seria un primer gran paso.

Vemos que OLLYDBG en su anlisis inicial nos muestra unos corchetes, que significa que eso es una rutina que empieza y termina all, vemos que hay dos, una para el cartel de NO LUCK que empieza en 401362 y otra para el GREAT WORK que empieza en 40134D. Si vamos a 401362 que es el inicio de la rutina donde estamos (aun dentro del MessageBoxA) y hago click all el OLLYDBG me muestra en las aclaraciones.

Quiere decir que OLLYDBG sabe que esa rutina ya que es DIRECTA es llamada desde 401245 veamos all que hay CLICK DERECHO GOTO CALL FROM 401245.

Hmm esta zona parece muy sospechosa hay una comparacin y un salto y segn el resultado de ese salto va al call de 401362 que es el que muestra NO LUCK y si no va al CALL 40134D que muestra GREAT WORK, esto no podemos perderlo pongamos un BREAKPOINT en dicho salto condicional.

Y quitemos los breakpoints en la api MessageBoxA por ahora, eso puede hacerse en la ventana B de breakpoints

Quito CON CLICK DERECHO-REMOVE los dos BREAKPOINTS y dejo solo el de 401243 que es el salto condicional.

Ahora doy RUN con F9 acepto el NO LUCK que estbamos antes y vuelvo a ingresar a poner el nombre y serial en este caso pondr, usen el mismo que yo, ya vern porque

Apreto OK

Vemos que de la comparacin NO SALTARA al no ser EAX y EBX iguales y seguir ejecutando en 401245 que nos llevara a CALL 401362 que sabemos que all esta el cartel malo, si no recuerdan, hagan click en 401245 y con CLICK DERECHO FOLLOW pueden ver adonde iria .

All vemos si ese salto condicional no salta pues, ira al cartel deqque el serial es malo, que pasa si cambio el salto condicional, haciendo doble click en el flag Z

All cambie el FLAG Z a 1 que seria como si EAX y ECX en la comparacin hubieran sido iguales y la resta de la comparacin hubiera sido cero y hubiera activado as el flag Z, el salto JE salta si el FLAG Z es uno, as que ahora saltara veamos.

All lo cambiamos y si vemos en 40124c con FOLLOW vemos que ira a

Jeje apretemos RUN o F9

O sea que esa comparacin y ese salto condicional que invertimos es el punto de inflexin de la registracin o validacin del serial en este crackme, segn si salta o no, pues sale el cartel bueno o malo, pero antes habamos visto que haba 2 carteles malos porque es eso, aqu no salio el primero, y eso es porque el crackme detecta el uso de nmeros en el nombre (antes haba puesto como nombre ricnar456) si es as te saca un primer cartel de NO LUCK, prueben nuevamente.

Al aceptar

Y recin al aceptar este primero, llega al salto condicional

Que muestra el mensaje definitivo. Como podemos recordar la primera vez que paramos en la api MessageBoxA en este tute fue por el primer cartel ese

Y la direccin de retorno era 4013C1

All vemos que el OLLYDBG en su anlisis me muestra una rutina que comienza en 40137e y termina en 4013C1 justo donde retorna de la api. Vemos tambin otra ayuda de OLLYDBG en 4013AC hay un > que significa que hay un salto que apunta hacia esa direccin si hacemos click all nos aclarara mas.

All vemos ora comparacin y un salto condicional que nos llevan al cartel maldito pongamos otro BREAKPOINT all.

Y demos RUN acepto el cartel malo anterior y voy a poner de nuevo

Al aceptar

Vemos que no saltara la primera vez que para hacia el cartel malo, aunque si compara cada letra que tipee a ver si son nmeros parara una vez por cada letra, F9 nuevamente A la 7ma vez que apreto recordar que en ricnar456 el 4 es la sptima letra me quiere mostrar el cartel malo saltando

Habamos visto que los JB saltan si es mas bajo y se activa el FLAG C, hago doble click en el FLAG C

Ahora ya no salta, apreto F9 y repito el mismo procedimiento para los otros dos nmeros que puse en mi nombre fuerzo que nunca salte.

Luego de eso si llego a la comparacin final y la cual debe saltar hago doble click en Z

Y al apretar F9

Ahora por supuesto todo esto lo hemos hecho en memoria cambiando FLAGS, como hacemos para guardar definitivos estos cambios y que el crackme acepte cualquier user y serial sin OLLYDBG. Vayamos al primer salto

Lo que nosotros hemos hecho en este salto es forzarlo mediante los flags a que no salte nunca a pesar de los valores de la comparacin, eso es similar a NOPEAR el salto condicional, si hago click all, apreto la barra espaciadora y escribo NOP.

Vemos que nunca saltara quito ese BREAKPOINT apretando F2

Ahora veamos el otro salto

En esta caso fue al revs lo forzamos a saltar siempre mediante la manipulacin del FLAG Z, lo cual seria equivalente a cambiar el salto condicional por un JMP.

All siempre saltara, quitamos tambin el breakpoint y sin salir de OLLYDBG probamos si quedo bien, apreto F9

Al apretar OK

Igual recordamos que cuando escribimos en OLLY con la barra espaciadora o ASSEMBLE los cambios desaparecan al reiniciar, tenemos que hallar la forma de que los guarde de la memoria al archivo definitivo, eso se hace de la siguiente manera

CLICK DERECHO en cualquier parte del listado COPY TO EXECUTABLE-ALL MODIFICATIONS all se nos abre esto

Elegimos COPY ALL para que copie los dos cambios que hicimos

Se nos abre otra ventana, all hacemos nuevamente CLICK DERECHO-SAVE FILE

Lo guardamos con OTRO NOMBRE para tener el original para seguir practicando le pondr CRACKME 2

Cierro el OLLYDBG y veo que al lado de donde tenia el crackme esta el crackme2

Hago doble click en el crackme2 a ver si quedo bien modificado lo corro sin OLLYDBG.

Voy REGISTER

Apreto OK

Jeje ah tengo el crackme parcheado pero aun no me conformare con esto, mas adelante veremos como trabaja con los seriales y como compara si en el nombre hay nmeros, exhaustivamente y hallaremos seriales correctos para nuestro nombre que los acepte sin parchear pero para llegar a eso aun faltan algunos conocimientos y practicas anteriores. APNDICE PARA WINDOWS 98 Bueno usar OLLYDBG en w98 como ya les dije es bastante limitado, el mismo sistema no nos deja poner BREAKPOINTS en las apis directamente como en w98, por lo tanto el mtodo ser similar con la nica limitacin que ustedes no podrn poner BREAKPOINT en la api, si hacen CLICK DERECHO SEARCH FOR NAME (labels) in this module como dice all la primera parte de la explicacin para XP

Les saldr la misma lista y de la misma forma apretando el nombre de la api llegaran hasta el nombre de la misma, pero en 98 no pueden hacer CLICK DERECHO-TOGGLE BREAKPOINT ON IMPORT ya que no permite poner BREAKPOINTS en las apis, si no que debern hacer.

Creo que el men es similar si no siempre tendr la opcin para BUSCAR LAS REFERENCIAS o sea los llamados a la api en el crackme.

Esto es limitadsimo comparado con la posibilidad de poner un BREAKPOINT en la API, porque si la API es llamada, si hay un BP en la API parara, en cambio en 98, la API puede ser llamada en alguna forma que engae el anlisis del OLLYDBG (y hay muchas formas cranlo) y no saldr dicha llamada entre las referencias y no tendrn forma de saber de donde fue llamada la api ni parara. Igual pueden seguir este tute de la misma forma sabiendo que hay tres llamadas a la api MessageboxA y en vez de poner UN BREAKPOINT en la api, pongo un BP en cada referencia a la api, all en el cuadro de referencias apreto F2 en cada una,

Al dar Run voy a HELP-REGISTER tipeo estos datos

Y al apretar OK parara

Luego en XP ponemos un BP en el RET de la api o donde termina la misma, eso equivale en 98 a poner un BP en el RET que esta justo debajo ya que no podemos entrar a la api.

Pues ya saben cuando el el tute dice que esta en el inicio de la api y ve a donde retorna ustedes saben que retorna en este caso a 4013C1 al ret que esta justo abajo y si es en otra referencia sera el RET que esta debajo correspondiente. Sabiendo esto ya pueden retornar a RETORNO DEL APNDICE PARA WINDOWS 98 desde aqu sigue para todos los SO. Y continuar el tute desde all siempre sabiendo la diferencia principal que es que en W98 no podemos poner BPX o BREAKPOINTS en las apis si no en las referencias. Hasta la parte 10 Ricardo Narvaja 22 de noviembre de 2005

INTRODUCCIN AL CRACKING EN OLLYDBG PARTE 10 BREAKPOINTS EN OLLYDBG


Esta parte la dedicaremos a entender los diferentes tipos de BREAKPOINTS en OLLYDBG, entendiendo por BREAKPOINTS las herramientas que trae OLLY para ayudarnos a detener la ejecucin del programa en donde nosotros deseamos, para los cual usamos uno de los diferentes tipos de Breakpoint que estudiaremos a continuacin, para lo cual usaremos como victima el inefable Crackme de Cruehead. BREAKPOINT COMUN o BPX Es el Breakpoint comn que hemos utilizado hasta ahora, tambin llamado BPX por su similitud a la forma de tipearlo en SOFTICE, muchas veces se utiliza la sigla BPX como abreviatura de BREAKPOINT, aunque estrictamente en OLLYDBG se tipea BP. Normalmente se puede colocar marcando la lnea que queremos ponerle el BPX y apretando F2, si apretamos F2 nuevamente se quitara. Miremos el CRACKME DE CRUEHEAD en el ENTRY POINT

Si marco por ejemplo 401018 y apreto F2, pues se marca en rojo la direccin para sealarnos que hay un BPX y adems en la ventana B que es la lista de BPX que hemos colocado, se nos mostrara.

Vemos que nos muestra que esta activo

En la columna ACTIVE nos dice que ALWAYS que significa que parara SIEMPRE que pase por all o sea que esta activo. Si hacemos Click derecho sobre el BPX podemos ver las opciones que tenemos para manejar el BREAKPOINT

REMOVE: para quitarlo de la lista totalmente DISABLE: Para que quede en la lista de BREAKPOINTS pero deshabilitado, o sea no parara all cuando pase por esa direccin. EDIT CONDITION: Para transformarlo en un BREAKPOINT CONDICIONAL que mas adelante ya veremos que es. FOLLOW IN DISASSEMBLER: Para buscar la direccin en el listado del breakpoint que marcamos. DISABLE ALL o ENABLE ALL: Deshabilitar o habilitar todos, en este caso habilitar todos no aparece porque el nico existente esta habilitado. COPY TO CLIPBOARD: para copiar al portapapeles los datos sobre el BPX marcado, si elegimos esta opcin y pegamos aqu por ejemplo.

Elijo WHOLE LINE o sea que copie toda la linea, WHOLE TABLE copiara toda la lista de BREAKPOINTS. Breakpoints, item 0 Address=00401018 Module=CRACKME Active=Always Disassembly=OR EAX,EAX Lo copiado y pegado aqu muestra los datos de ese BREAKPOINT como la instruccin donde fue colocado, su direccin, si esta activo etc. Ya vimos que si doy RUN con F9, parara en la direccin del BPX si se ejecuta, en este caso para. All paro

Y OLLY nos dice que esta PAUSADO

Y a la izquierda nos muestra el motivo porque paro

Ahora estrictamente el BPX que es ?, veamos si realiza OLLYDBG algun cambio en el codigo al activarlo. Si hago click derecho FOLLOW IN DUMP-SELECTION

Podremos ver la direccion 401018 y su contenido en el DUMP

Aparentemente no hay cambios con respecto a los que vemos en el listado

All vemos tanto en el DUMP como en el listado los bytes 0B C0 correspondientes a la instruccin OR EAX,EAX asi que no hay cambios parece pero es as realmente? Reiniciemos el crackme y veamos que el BPX contine puesto en 401018

Voy a escribir una lnea que leer de la memoria realmente el valor que hay all.

Eso leer el contenido de 401018 y lo mover a EAX, veamos que dice la aclaracin de OLLY

Tanto en el DUMP como en la aclaracin nos muestra 0B C0 los bytes originales, pero aun desconfo, apreto F7 para ver que mueve a EAX.

Como no era que en 401018 estaban los bytes 0B C0 74 01 ?, alguien esta mintiendo aqu pues esos bytes al revs son 0174C00B y el valor que movi a EAX es 0174C0CC, o sea que realmente en 401018 no hay un B0 cuando pongo un BREAKPOINT, OLLYDBG lo reemplaza por el valor CC que mas adelante cuando veamos el estudio de las excepciones, veremos bien que significa, pero OJO a pesar de que OLLYDBG para no ensuciar el listado original, no lo cambia ni en el DUMP, ni en las aclaraciones, cada vez que ponemos un BP estamos colocando el byte 0CC en la direccin del BPX y eso como ven puede ser fcilmente detectado por un programa que verifique si en esa direccin hay un CC en vez del cdigo original, y de esa forma detecta que hay un debugger y puede evitar que corra el programa saltando si encuentra un CC a la salida del mismo.

As que no se confen, recuerden siempre que si apretamos F2 cambiamos cdigo aunque OLLY mantenga todo igual y el programa contine, dicho BREAKPOINT puede ser detectado, si en algn programa ven que al colocarle un BREAKPOINT no corre pues qutenlo hay otras posibilidades en OLLYDBG para parar donde queremos. Tambin un BREAKPOINT se puede tipear en la commandbar BP 401018

En NT, 2000, XP y 2003 no hay problemas para colocar BP en las apis como vimos en partes anteriores podemos poner un BP en la api MessageBoxA, tipeando

Lo escribimos respetando las maysculas y minsculas del nombre de la api, en Windows 98 en cambio ya que no se puede colocar breakpoint en las apis se tipea.

Lo cual nos pone BREAKPOINTS en las referencias o llamadas que el programa haga a la api y que OLLYDBG pueda detectar, lo cual no es muy bueno, pero en 98 no hay otra posibilidad. Por supuesto el comando BPX existe tambin en XP aunque no es usado prcticamente, porque siempre es mas poderoso colocar un BP en la misma api que en las llamadas a la misma que OLLYDBG pueda detectar. Igual vemos que coloco algunas

All en la lista de BREAKPOINTS al apretar BPX MessageBoxA encontr tres llamadas a dicha api y le puso un BP a cada una. De cualquier forma aclaro que este comando no lo usare casi nunca al no trabajar en WINDOWS 98, y siempre que me refiera a un BREAKPOINT o BPX me refiero a tipear BP en la comandbar. La ultima forma de colocar un BP es con el Mouse haciendo doble click en la lnea que queremos colocarlo, en la columna donde estn los bytes de la instruccin, al hacer doble click nuevamente se quita.

BREAKPOINTS MEMORIA)

ON

MEMORY

(MEMORY

BREAKPOINTS

BREAKPOINTS

EN

Bueno pasemos a los MEMORY BREAKPOINTS o tambin llamados BPM por BREAKPOINT ON MEMORY (algunos viejos memoriosos no confundir con los BPM del SOFTICE que son otra cosa) Bueno como funcionan,al colocarlos OLLYDBG lo que hace es cambiarle el permiso de una seccin o parte de la misma, segn el permiso que le demos, podemos colocar BPM ON ACCESS que detendr la ejecucin, cuando se acceda al sector al cual le colocamos el BPM, o sea parara cuando ejecute esos bytes o cuando lea o escriba en los mismos. Tambin existe el BPM ON WRITE que para solo cuando escribe en la zona que colocamos el BPM, veremos algunos ejemplos prcticos.

All estoy en el ENTRY POINT del Crackme de Cruehead, y pondr distintos BPM, para ver la utilidad de los mismos. En el DUMP voy a ver la direccin 4020CA con GO TO EXPRESIN : 4020CA

All la veo, puedo colocar un BPM ON ACCESS en los 4 bytes del contenido de la direccin 4020CA, y dar RUN, supuestamente parara o bien cuando lea de 4020CA, o cuando escriba en 4020CA o si ejecuta alguna instruccin en 4020CA, para colocar el BPM marco los bytes que quiero que abarque en este caso marco cuatro.

Ah estn marcados, hago click derecho BREAKPOINT-MEMORY ON ACCESS que es poner un BPM ON ACCESS en los bytes que marque, que en este caso son 4 pero podran ser mas o menos segn lo que nos convenga, o sea podemos marcar zonas mas grandes, y colocarles BPM en la misma forma.

Lo nico molesto que tienen los BPM es que no figuran en la ventana B de breakpoints ni en ninguna parte en OLLY, por lo cual debemos recordar donde lo colocamos. A su vez OLLY permite solo un BPM a la vez por lo cual si colocamos un segundo, automticamente borra el anterior. Bueno demos RUN y para en 401007 donde el programa trata de escribir en nuestra zona del BPM o sea en 4020CA.

Si vemos el motivo por cual paro, abajo en OLLYDBG nos dice

Esta por escribir el valor que esta en EAX al contenido de 4020CA, lo cual provoca que OLLYDBG pare, si recuerdan cuando tratbamos de escribir en la memoria y esta no tenia permiso de escritura, se generaba una excepcin, pues eso es lo que bsicamente hace OLLYDBG, al colocar un BPM ON ACCESS le quita el permiso de lectura y de escritura a esa zona, y al tratar de escribir o leer de all, genera una excepcin que detiene el programa, ya lo veremos mas claramente cuando veamos el capitulo de excepciones, pero es bueno que tengan una idea. Si apreto F7 ahora si guardara el valor ya que el mecanismo del OLLY es sofisticado y permite que una vez detenido, si se pueda escribir al apretar f7.

All esta guardo 400000 si doy RUN nuevamente como el BPM esta aun activo, parara si el programa vuelve a escribir o intenta leer este valor.

Vemos que ahora para all, al tratar de leer de 4020CA en este caso nos dice MEMORY BREAKPOINT ON READING ya que paro al leer de all.

Si apreto F7 lee el valor guardado y lo pasa a EAX

Apreto F9 a ver si alguna vez mas para.

Nuevamente para ON READING ya que lee el valor que hay en 4020CA y lo manda al stack con PUSH.

Ahora si quiero quitar el BPM que coloque hago click derecho en el DUMP y elijo BREAKPOINTREMOVE MEMORY BREAKPOINT y con eso se quita, lo mismo como ya dijimos si colocamos uno nuevo.

En el caso anterior si al colocar el BREAKPOINT, hubiramos elegido que sea ON WRITE o sea en escritura, OLLYDBG parara solo cuando escriba en la zona del BPM y no cuando lee. Otra opcin que nos da OLLYDBG es colocar un BPM en una seccin completa. Para ellos vamos a VIEW-MEMORY o a la ventana M que es lo mismo.

All vemos las secciones del crackme y mas abajo las secciones de las dlls y diferentes secciones utilizadas, podemos marcar la que deseemos por ejemplo, la seccin que comienza en 401000 all la vemos.

Hago click derecho en dicha seccin y elijo SET MEMORY BREAKPOINT ON ACCESS.

Vemos que justo debajo tenemos la posibilidad de colocar tambin un BPM ON WRITE pero en este caso lo haremos ON ACCESS doy RUN.

Vemos que para en la siguiente lnea veamos porque

Claro paro ON EXECUTION o sea el ejecutar, ya que pusimos el BPM en la seccin que se ejecuta, pues al tratar de ejecutar alguna instruccin en dicha seccin, para en este caso ON EXECUTION.

Ahora cambiaremos el BPM a la seccin de KERNEL32 que esta a continuacin del header, en mi caso es esta.

Le coloco un BPM ON ACCESS all, as que parara cuando lea, escriba all o cuando ejecute alguna instruccin en esa seccin de KERNEL32, jeje doy RUN.

En mi caso para all y si veo en el stack, veo que paro en una api

En este caso para al ejecutar una instruccin de la kernel32.dll y me funciono para saber cual es la primer api accedida desde el programa en dicha dll, si vemos la direccin de retorno en la primera lnea del stack.

Si vemos adonde retornara con click derecho- FOLLOW IN DISASSEMBLER

All vemos que retornara a 401007 de la llamada a GetModuleHandleA que hay al inicio del programa.

Veo que un poco mas abajo hay una llamada a FindWindowA pero esa no parara pues corresponde a otra dll, en este caso a User32.dll. Si doy run nuevamente parara en la siguiente lnea de la api ya que el BREAKPOINT ON ACCESS me hace parar en cada lnea de la misma que se esta ejecutando, pues entonces lo quitare con REMOVE MEMORY BREAKPOINT como antes. Si quiero volver al programa, hago click derecho EXECUTE TILL USER CODE, o si no funciona en algn caso, puedo usar all mismo EXECUTE TILL RETURN lo que me lleva hasta el RET y luego apreto F7 y vuelvo al programa.

En este caso EXECUTE TILL USER CODE funciona perfectamente ya veremos en que casos no funciona.

Si pongo un BPM de nuevo en la kernel32.dll parara en la siguiente api que se ejecute de esa dll y asi. Tambin si no puedo colocar porque es detectado un BP MessageBoxA porque el programa detecta el CC como vimos antes podemos poner un BPM all tambin y cumplir la misma funcin, veamos el ejemplo

En mi maquina es 77D504EA as que voy all en el listado con GOTO EXPRESIN, puedo tipear la direccin o el nombre siempre respetando maysculas y minsculas.

Marco la primera lnea

Y veo que tambin tengo la posibilidad de elegir poner un BPM ON ACCESS o ON WRITE, elijo la primera opcin y doy RUN.

Voy a HELP REGISTER y all pongo un user y serial cualquiera

Al apretar OK

Para en la misma forma en la api que si hubiramos puesto un BP all y si los BP son detectados es otro metodo para parar alli, que aunque puede ser detectado por el programa, mirando el permiso de la zona si cambio, igual es menos probable que ello ocurra, al menos es otra alternativa y hay que conocerlas todas. Bueno para la parte siguiente nos quedan los HARDWARE BREAKPOINT y los MESSAGE BREAKPOINTS y el caso de los BPX CONDICIONALES que requiere ms explicacin, creo que por ahora tienen para practicar. Hasta la parte 11 Ricardo Narvaja 26 de noviembre de 2005

You might also like