introduccion al cracking con ollydbg partes 1 a 10 l

Upload: javier-valencia-murillo

Post on 08-Jul-2015

196 views

Category:

Documents


5 download

TRANSCRIPT

INTRODUCCION AL CRACKING CON OLLYDBG DESDE CEROLa 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 PRIMEROExactamente 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 2Luego 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

E

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 INSTRUCCIONESComo 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 STACKBueno 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.

POPLa 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 DATOSMOV 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 5INSTRUCCIONES 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 LOGICASProvienen 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

OREn 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

XORAqu 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 est