Está en la página 1de 22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

Foro de elhacker.net
Programacin => Ingeniera Inversa => Mensaje iniciado por: Shaddy en 17 Septiembre 2007, 23:54

Ttulo: Taller de Cracking desde cero - (actualizado: 27.julio.2008) Publicado por: Shaddy en 17 Septiembre 2007, 23:54

Taller de Cracking desde 0 por karmany


y Shaddy
INTRODUCCIN
Qu es esto del Taller de Cracking desde 0? Bien, despus de juntarnos ambos, y dada nuestra experiencia, hemos pensado que lo mejor para que una persona empiece a conocer este fantstico mundo de la ingeniera inversa, es ensear las cosas ms bsicas. Este Taller de Cracking desde 0 va orientado a todas esas personas que tienen muy pocos conocimientos (o ninguno) y que por este motivo no han querido iniciarse en este Arte, que suele ser considerado algo complejo. Todos nuestros esfuerzos, por lo tanto, van a ir dirigidos a hacer que esta gente sin conocimientos, de sus primeros pasos y logre entender los conceptos ms bsicos. Estamos seguros, que a gente avanzada tambin les puede ayudar a recordar, as que esperamos que os guste y que pueda ayudar a "empezar a caminar"... Como todo, hay que empezar por lo ms bsico, no podemos hablar de debugger sin conocer nada de ensamblador y no podemos hablar de ensamblador sin ni siquiera saber qu es el cdigo mquina.

Ttulo: Re: Taller de Cracking desde 0 Publicado por: karmany en 18 Septiembre 2007, 22:05

Del Cdigo Mquina al Lenguaje Ensamblador


Realmente, qu es lo que entiende un "ordenador"? Como se ha dicho millones de veces: 0 (ceros) y 1 (unos) --> (bits) El cdigo o lenguaje mquina consta de cadenas de estos 0 y 1, que el microprocesador entiende directamente. Una y slo una secuencia de estos 0 y 1 realizar una determinada operacin. Programar directamente en este sistema binario, como se puede uno imaginar, puede resultar muy muy duro y es muy fcil equivocarse.
foro.elhacker.net/printpage.html;topic=180886.0 1/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

Por este motivo, para facilitar la escritura de programas, podemos ayudarnos del lenguaje ensamblador (lenguaje de bajo nivel y el que vamos a conocer aqu.), el cual utiliza nemotcnicos (normalmente abreviaturas de palabras en ingls) que se utilizan para definir una determinada instruccin. Por ejemplo: ADD A, B. Se suma a A el valor de B y el resultado se guardara en (A). Para los que recin empiezan, imaginemos estos valores de A y B: A=3 B=2 por lo tanto, tras ADD A, B, nos quedara: A=5 B=2 En este punto, alguien podr pensar: -Bueno, escribir un programa en lenguaje ensamblador no es que sea tarea fcil, adems existen muchos otros lenguajes de alto nivel que nos pueden facilitar enormemente las cosas a la hora de programar... entonces... Por qu en ingeniera inversa hay que aprender lenguaje ensamblador? Si abrieramos cualquier programa y echramos una ojeada al cdigo, observaramos el lenguaje mquina, independientemente del lenguaje de programacin con que haya sido programado (compilado). Es lgico, ya que como se ha explicado, es lo que el microprocesador entiende. Sin embargo, entender esas secuencias de 0 y 1 que hacen realizar determinadas operaciones, es verdaderamente complicado, por este motivo existen muchos programas que a partir del lenguaje mquina obtienen el lenguaje ensamblador, que ya es mucho ms entendible al ser humano. Estos programas se denominan desensambladores. Entendido todo esto, vamos a dar los primeros pequeos pasos en ensamblador, del ingls Assembly. Ttulo: Re: Taller de Cracking desde 0 Publicado por: Shaddy en 18 Septiembre 2007, 23:38

Practicando Assembly
1.- Introduccin Es importante antes de adentrarnos en el mundo de los Depuradores, Desensambladores y dems herramientas que conozcamos y tengamos una buena nocin de lo que es el Assembly. Empezaremos suave, haciendo breves ejemplos y poco a poco. 2.- Instrucciones Bsicas: Parte I Comenzaremos por las instrucciones ms bsicas, con breves explicaciones y ejemplos: MOV, CMP, TEST, ADD, SUB, INC, DEC. MOV: Se utiliza para mover un dato de un registro a otro.
foro.elhacker.net/printpage.html;topic=180886.0 2/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

Ej: MOV A, B. El valor de A pasara a ser igual que el valor de B. CMP: Compara el valor de dos registros. Ej: CMP A, B. Se efecta una comparacin entre A y B. TEST: Compara el valor de dos registros. Ej: TEST A, B. Se efecta una comparacin entre A y B.
Nota: En capitulos posteriores escribiremos la diferencia entre CMP y TEST .

ADD: Suma el valor de dos registros almacenandolo en el primero. Ej: ADD A, B. Se suma a A el valor de B y el resultado se guardara en (A). SUB: Resta el valor de dos registros almacenandolo en el primero. Ej: SUB A, B. Se resta a A el valor de B y el resultado se guardara en (A). INC : Incrementa el valor en 1 de un registro. Ej: INC A. Se incrementara el valor de A en 1. DEC : Decrementa el valor en 1 de un registro. Ej: DEC A. Se decrementara el valor de A en 1. 2.- Los Registros: Parte I Antes de adentrarnos en los Registros quiero hacer un breve comentario sobre las API. Bien, en cualquier programa compilado bajo windows se utilizan unas denominadas API, stas son bsicamente las que forman todo lo que percibes, as como ventanas, botones, movimientos del ratn, etc... y tambin todas las acciones que haces. La manera de llamarlas es bsicamente una estructura. No la explicar de momento porque es pronto para ello pero os har un breve ejemplo:
C itar PUSH EAX PUSH EDX C ALL lstrcatA

Imaginemos esas instrucciones, en ste caso digamos que mete EAX y EDX en la pila (que lo que explicar ms adelante) para as tratar los valores antes de llamar a la API lstrcat que se encarga de concatenar (juntar) 2 cadenas. En ste caso si EAX apunta a "hola" y EDX a " mundo" una vez ejecutada la API en EAX quedara la cadena/string "hola mundo". As que como explicar ahora EAX ha sido utiliza de "Acumulador" porque ha acumulado el resultado de la API. Hablaremos de los Registros Comunes de los cuales destaco:
foro.elhacker.net/printpage.html;topic=180886.0 3/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

EAX, ECX, EDX, EBX. 1.- EAX: Acumulador - Como ya expliqu, una vez ejecutada una API, se suelen devolver principalmente el o los resultados a EAX. 2.- EBX: Base - ste se suele utilizar como Base en los algoritmos. Es decir, si EBX vale 10, esa ser la BASE de la cantidad de veces que se hace un proceso especfico. 3.- ECX: Contador - ste sera en el ejemplo anterior el que hace de contador, con una instruccin tipo INC ECX cada vez se ira sumando de 1 en 1 hasta llegar al nmero del registro BASE (EBX) 10, as que utilizando estos dos ltimos ejemplos se hara durante 10 veces una funcion (por ejemplo, multiplicar por 3 diez veces). Ej:
C itar
Notas: EAX = 1 ; EBX = 10

Inicio: MUL EAX, 3 ; MUL: Multiplica 2 registros almacenando en el primero. INC EC X C MP EC X, EBX JNE Inicio ; JNE: es un salto condicional (JNE: JUMP IF NOT EQUAL / Salta si no es igual) que va hacia la direccin que le indiques siempre y cuando el resultado de la comparacin anterior sea desigal .

4.- EDX: Datos - ste es utilizado tambin antes de invocar a una API para darle los datos. 3.- LA PILA: Parte I Qu es la PILA? - Tcnicamente es una estructura de datos, del tipo LIFO (del ingls Last In First Out, ltimo en entrar, primero en salir). Texto extrado de la wikipedia.. y vosotros os preguntaris, que esto de una estructura?, Bien. Imaginad que formamos una ventana, o por ejemplo, el tpico mensaje de texto. En ste caso es la API MessageBoxA . (http://www.homeandlearn.co.uk/net/images/messageboxDelete.jpg) En ste caso vemos 3 partes claramente identificables: - Ttulo : "Delete". - Cuerpo : "Do you really want to Delete this Record?". - Botones : " YesNo". Y claro, aqu es donde entra el papel de la pila, antes de invocar a la API MessageBoxA1 tenemos que indicarle todos estos datos para que nos la forme tal y como nosotros le hemos indicado. En Ensamblador, (a nivel de cdigo mquina), sto sera visualizado as: 1 MessageBoxA es la API encargada de lanzar ese mensaje tipo "caja de texto" que puse en
foro.elhacker.net/printpage.html;topic=180886.0 4/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

la imagen.
C itar PUSH Ttulo PUSH Cuerpo PUSH Botones C ALL MessageBoxA

Entonces ah vemos que cada elemento es primero insertado en la pila mediante la instruccin PUSH. La pila tiene la cualidad de lo ltimo que metes, es lo primero que sacas. Es decir, en nuestro caso ahora la pila tendra sta forma.
Las direcciones son imaginaras, normalmente la pila se visualiza con las correspondientes direcciones hacia donde apuntan (pueden apuntar a una cadena de texto que contenga el ttulo

00401005 Botones 00401000 Cuerpo 00401020 Ttulo de manera que si ahora nos encontrramos con una instruccin tipo POP EAX extraeramos Botones por ser la ltima que se introdujo hacia el REGISTRO EAX el cual hemos indicado mediante la instruccin. sta estructura es un ejemplo, de que existe una zona donde se guardan valores MUY importantes en el flujo de un programa, as como por ejemplo, si se ejecutara la instruccin CALL MessageBoxA y sta se encontrara por ejemplo en la direccin 402500 (vamos a hacer un ejemplo de donde la direccin en la que se sitan las instrucciones):
Atendiendo al ejemplo de antes aado las mismas instrucciones pero con sus respectivas direcciones imaginarias.
C itar 402500| PUSH Ttulo 402504| PUSH Cuerpo 402508| PUSH Botones 40250A | C ALL MessageBoxA 40250F | MO V EAX, EBX

En ste caso una vez se ejecute la instruccin CALL MessageBoxA, se almacenar en la pila tambin la direccin de RETORNO, es decir, la direccin en la que regresar una vez haya sido llamado. Atendiendo al ejemplo de antes la pila en ste caso quedara as. 00401008 00401005 00401000 00401020 RETURN to 40250F Botones Cuerpo Ttulo

As como vemos, tambin se a almacenado la direccin hacia donde tendr que volver despues del MessageBoxA. Por el momento vamos teniendo nociones de cada parte pero sin profundizar en nada, si no lo entendis completamente no os preocupis, es normal, a medida que lo vayamos viendo todo tomar forma y os saldr mecnicamente. 4.- LOS REGISTROS: PARTE II [PRCTICAS] Ahora imaginemos varias situaciones, voy a escribir unas instrucciones y quiero que me digis el valor de los registros finales. (si queris
foro.elhacker.net/printpage.html;topic=180886.0 5/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

responder a un privado me alegrar ver que seguis el curso, aunque seamos lentos :P).
C ita de : Eje rcicio 1 MO V EAX, 1530h ADD EAX, 1000h SUB EAX, 500h MO V EBX, 100h SUB EAX, EBX

Normalmente cuando crackeamos utilizamos registros de 32 Bit, entre los cuales podemos encontrarnos EAX, EBX, ECX, EDX, etc. Pero stos se componen de varias partes segn tamao: EAX (32 bits) se descompone en: AX (16BIT) que ste mismo se descompone en: AH y AL (8 Bit cada uno) Para que veis un ejemplo sobre el valor: 12345678 => EAX 12345678 => AX 12345678 => AH 12345678 => AL Siempre debemos estar al tanto de sobre QUE valores trabajamos, es decir, si nos encontramos una instruccin tipo:
C itar MO V AL, 5

Sabemos que slamente hay una posibilidad, pero tambien debemos saber a que parte de EAX corresponde, porque si fuese AX por ejemplo ya cambiara la posicin del movimiento. Mas adelante veremos como se trabaja con "punteros", y ah deberemos tener bien claro stas correspondencias: DWORD -> EAX WORD -> AX BYTE -> AH y AL
C itar Eje rcicio 2: MO V EAX, 00004932h ADD AX, 45h SUB AL, 0Ah

5.- SALTOS CONDICIONALES Y BANDERAS: PARTE I [PRCTICAS] Que son los saltos condicionales? Que son las banderas?
foro.elhacker.net/printpage.html;topic=180886.0 6/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

Los saltos condicionales son instrucciones que al ejecutarse hacen que el flujo se traslade a la direccin que apunte. Es decir, cuando nos encontramos con una instruccion del tipo "salto condicional" nos llevar (si se cumple la condicion) hacia donde apunte. Veamos un ejemplo:
C itar C MP EAX, EBX JE 401000

la primera instruccion compara el contenido de EBX con el contenido de EAX, el resultado de la comparacion pondra a 1 la BANDERA "Z" si es corrercto, y a 0 si no lo es. y la siguiente instruccion saltar si la comparacin ha sido correcta (JUMP IF EQUAL => JE) ha la direccion "401000". En ste ejemplo comprobamos 2 cosas, que hay unas banderas que se activan o bien con 0 o con 1 en funcin de las operaciones aritmticas que vayan generandose a lo largo del programa, y que hay instrucciones que actuan en funcin de las mismas, veamos que tipos de satos hay: JE JNE o JNZ JB JBE JP JPE JL JLE [CONTINUAR] EN CONSTRUCCIN Ttulo: Re: Taller de Cracking desde 0 Publicado por: karmany en 28 Septiembre 2007, 22:38

OllyDBg - Asndonos con OllyDBG

Pequea Introduccin. Habiendo una gran cantidad de debuggers en la actualidad, Por qu vamos a hacer la introduccin con OllyDBG? Ciertamente existen muchsimos debuggers, pero OllyDBG, desde su aparicin, tuvo muchos adeptos; tal vez por su sencillez, por su intuicin, por su apariencia o quiz por la gran cantidad de tutoriales que se hicieron y se siguen haciendo, ha sido y es un programa muy utilizado. Cuando una persona empieza a manejar un programa, necesita informacin y OllyDBG creemos que es un debugger del que se ha hablado muchsimo y solamente con ver "Introduccin al OllyDBG desde cero" realizado por Ricardo Narvaja ya tenemos una base impresionante no slo para empezar, sino para
foro.elhacker.net/printpage.html;topic=180886.0 7/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

obtener un nivel ms que aceptable. OllyDBG es un debugger con el que hemos estado muchsimas horas, por este motivo, nos va a facilitar enormemente nuestra labor. La idea de este: "asndonos con OllyDBG" es iniciar a todo forero en su uso e ir perdiendo el miedo a utilizarlo. Posteriormente ya se podrn tratar otros temas o leer otros tutoriales o... utilizar otros programas...

Presentacin de OllyDBG. OllyDBG es principalmente un debugger para aplicaciones a 32 bits en Microsoft Windows. Es un debugger en Ring3. Tiene muchsimas otras opciones e incluso es posible la utilizacin de plugins (o si eres programador hacerlos t mismo) que hacen de l un programa verdaderamente potente. Para conocer sus caractersticas podemos visitar su pgina Web: http://www.ollydbg.de/ Para descargar el programa podemos descargar la versin 1.10 bsica, sin ningn plugin y ninguna modificacin desde su pgina web, aqu: http://www.ollydbg.de/odbg110.zip Sin embargo, yo recomiendo descargar el OllyDBG de ShadowDark, que es un OllyDBG modificado para no ser reconocido, con unas cuantas opciones ms y con los plugins ms utilizados. Se puede descargar de aqu: http://www.ech2004.net/download.php?archivo=123&tipo=h http://rapidshare.com/files/66787872/OllyShadow.rar Vamos a abrirlo por primera vez. Abriremos cualquier ejecutable para examinarlo. Para esto vamos a File --> Open o pulsamos simplemente F3 y seleccionamos cualquier exe. OllyDBG puede mostrar distintas pantallas con diferentes datos, as que para entenderlo vamos a seleccionar una pantalla que OllyDBG identifica como "CPU" (es la que por defecto se muestra primeramente, tambin llamada "ventana del desensamblador") y la podemos seleccionar de este modo: -En el menu: View --> CPU -Pulsando Alt + C -O bien pulsando el botn "C" de (CPU) que hay en la barra de herramientas. Si dejamos el ratn sobre este botn nos mostrar abajo a la izquierda: Show CPU (Alt+C) Su interfaz es la siguiente: (http://img251.imageshack.us/img251/7964/ollycpuus8.jpg) Fig.1 Podemos dividirla del siguiente modo: (http://img170.imageshack.us/img170/6183/ventanapopepb2.jpg)
Imagen original de The Pope (Fig.2)

Vamos a examinar ms detenidamente las ventanas marcadas en color, una por una:
foro.elhacker.net/printpage.html;topic=180886.0 8/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

Ttulo: Ventana de desensamblado Publicado por: karmany en 18 Noviembre 2007, 17:59

1.0 Ventana de desensamblado - OllyDBG:


Esta ventana (subventana mejor dicho) est dividida a su vez en 4 columnas. Existe una barra para describir estas cuatro columnas y la podemos hacer aparecer o desaparecer pulsando el botn derecho dentro de la ventana de desensamblado (CPU) y seleccionando: Appearance --> Show bar o Appearance --> Hide bar respectivamente. La imagen de la ventana de desensamblado con la barra descriptiva comentada es la siguiente: (http://img353.imageshack.us/img353/9960/20080721162048qw4.jpg) 1) La primera columna "Address" muestra la direccin donde se ejecutar el cdigo. 2) La segunda columna "Hex dump" muestra los bytes que forman la instruccin que hay a la derecha (columna "Disassembly). 3) La tercera columna "Disassembly" indica el desensamblado propiamente dicho. Como ya se ha hablado antes de l, no hace falta explicar mucho ms. 4) La ltima columna "Comment" nos puede mostrar: comentarios propios, cadenas de texto, direcciones, nombres de funciones y direcciones, datos que vamos a insertar en la pila a cierta funcin o API etc... que nos pueden ayudar muchsimo. Tomemos la primera linea: Address Hex dump 40125C 68 2C 14 40 00 Disassembly PUSH 40142C Comment

La direccin donde se ejecuta ese PUSH 40142C es 40125C . Los bytes que forman la instruccin PUSH 40142C son 68 2C 14 40 00, donde Olly ha hecho el desensamblado correcto, sabiendo que 68 equivale a PUSH y 2C 14 40 00 equivale al valor: 0040142C ya que ese PUSH (68) requiere como dato 4 bytes. Bien sencillo. Address: Si cliqueamos dos veces sobre esta columna veremos, cmo nos muestra o cambia de direcciones absolutas a direcciones relativas y viceversa. Hex dump: Si cliqueamos dos veces, lo que equivale a pulsar F2, pondremos o quitaremos un punto de ruptura, breakpoint o lugar donde el debugger parar. Se pondr la direccin en rojo. Para ver todos los breakpoints que hemos colocado podemos verlos en: View --> Breakpoints o Alt+B Podemos tambin modificar los bytes, copiarlos, pegarlos, convertirlos a ceros o en NOP's etc... pulsando botn derecho y seleccionando Binary y sus submenus. Disassembly: Si cliqueamos dos veces (o pulsamos la tecla del espacio), se abrir una pequea ventana en donde podremos escribir nosotros mismos la instruccin que queramos. Tiene una opcin: "Fill will NOP's": Si se tilda rellenar con NOP's lo que quede de la instruccin que hemos modificado, por el contrario, si no se
foro.elhacker.net/printpage.html;topic=180886.0 9/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

tilda, lo que quede de cdigo ser de nuevo ensamblado dando posibles resultados inesperados. (Yo recomiendo tildarla). Una de las cosas que hacen ms fcil escribir en ensamblador desde el propio OllyDBG, es que permite escribir instrucciones sin poner por ej. el tamao(BYTEWORD-DWORD). Por ejemplo, sea la siguiente instruccin: MOV EAX,DWORD PTR DS:[400000] Nosotros simplemente con poner MOV EAX, DS:[400000], OllyDBG ya entender que estamos trabajando con el registro EAX que requiere un Dword y automticamente pondr: MOV EAX,DWORD PTR DS:[400000]. Si nos equivocamos siempre tenemos la opcin: Botn derecho -->Undo Selection para restaurar lo original. Comment: OllyDBG rellena adecuadamente todos los comentarios necesarios, que hacen que el cdigo sea mucho ms entendible. Nosotros del mismo modo, podemos modificar cualquier comentario y poner lo que nosotros queramos...a fin de que sea ms fcil despus entender todo. Simplemente cliqueamos dos veces sobre esa columna y aparecer una pequea ventana que pondr de ttulo: "Add comment" o "Change comment" (aadir comentario o modificar comentario). Si modificamos un comentario que tena ya OllyDBG, podemos simplemente borrar el nuestro y automticamente volver a aparecer el original. Poner un comentario propio es realmente muy til y adems nos puede ayudar posteriormente a recordar ese punto... por ejemplo, imaginemos lo siguiente: 0040100A DEC EAX, podra ser que en EAX hubiera por ej. el nmero de vidas y en este momento nos la disminuye en una (DEC EAX). Podramos poner de comentario: "Quita una vida". Si despus no nos acordamos de la direccin podemos buscarla pulsando botn derecho --> Seach for --> user-defined comment y ah veremos nuestro "Quita una vida". La ventana de desensamblado es la ms utilizada, as que hay que conocerla un poco ms a fondo en su manejo, ya que es posible que tengas que estar frente a ella muchas horas... Vamos a ver ahora la barra de herramientas, y lo relacionado con esta ventana de desensamblado. Los primeros botones que he numerado son los siguientes: (http://img183.imageshack.us/img183/4480/botonesollywm3.jpg) El primero (el que est debajo de la C, no lo he numerado porque sencillamente es el que abre el cuadro de dilogo para abrir un archivo). Los siguientes y por orden tienen la siguiente funcin: 1.- Equivale a pulsar "Ctrl+F2" o ir al men "Debug --> restart". Reinicia de nuevo la depuracin del programa. Segn la configuracin de OllyDBG se reiniciar y se pausar normalmente en el Entry Point (EP) del programa que vamos a debugear. 2.- Equivale a pulsar "Alt+F2" o ir al men "Debug --> Close". Termina el programa que est siendo debugeado, pero sin cerrar el OllyDBG. 3.- Equivale a pulsar "F9" o ir al men "Debug --> Run". Ejecuta el programa que est siendo debugeado. 4.- Equivale a pulsar "F12" o ir al men "Debug --> Pause". Pausa al programa que est siendo debugeado. 5.- Equivale a pulsar "F7" o ir al men "Debug --> Step Into". Hace ir al debuger instruccin por instruccin entrando en todas las call y subrutinas.
foro.elhacker.net/printpage.html;topic=180886.0 10/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

6.- Equivale a pulsar "F8" o ir al men "Debug --> Step Over". Hace ir al debuger instruccin por instruccin pero sin entrar en ninguna call o subrutina. 7.- y 8.- No las vamos a ver en este "Cracking desde cero" porque sale de nuestras espectativas. 9.- Equivale a pulsar "Ctrl+F9" o ir al men "Debug --> Execute till return". Tras pulsar este botn el debuger parar en el siguiente RETN que haya. Puede ser muy til por ejemplo al entrar en una subrutina y querer buscar el final. 10.- Equivale a pulsar "Ctrl+G". En la ventana que aparece, podemos introducir la direccin, y tras aceptar, en la ventana de desensamblado podremos ver el cdigo que hay en dicha direccin. Tenemos muchas ms opciones pulsando el botn derecho, o seleccionando en los diferentes mens. Veremos las ms importantes. Aunque para los recin iniciados sea un poco lioso recordar todo, en el siguiente apartado haremos unos sencillos ejemplos utilizando lo ms bsico. Veremos cmo manejarnos en la ventana de desensamblado.

Ttulo: Ejemplos ventana de desensamblado Publicado por: karmany en 18 Noviembre 2007, 18:14

1.1 Ejemplos en Ventana de desensamblado OllyDBG:


Vamos a manejarnos un poco con lo ms bsico en esta ventana. Voy a abrir un programa cualquiera con el OllyDBG y pongo una imagen de la ventana de desensamblado: (http://img179.imageshack.us/img179/254/20080721163023wt6.jpg) Estamos parados en el OEP (Punto de Entrada Original) del programa. Si se observa un poco vemos en la imagen un salto a la librera MSVBVM60, por lo tanto podemos ya imaginarnos que se trata de un programa compilado con Visual Basic. Vamos a hacer unos pequeos ejerccios: 1.- Ir a la direccin 418E80. -Como expliqu en el prrafo anterior podemos o bien pulsar el botn nmero 10 de la siguiente imagen: (http://img183.imageshack.us/img183/4480/botonesollywm3.jpg) o bien, podemos pulsar Ctrl+G o botn derecho --> Goto --> Expresion. De estas 3 formas se nos abrir una ventana y ah podremos poner la direccin a la que queremos ir: 418E80: (http://img377.imageshack.us/img377/5466/20080721163247fq0.jpg) pulsamos Ok y nos llevar directamente a esa direccin. 2.- Poner un Breakpoint (BP - lugar donde parar el debugger) en 418E80 Lo primero vamos a la direccin 418E80, explicado en el punto anterior. Una vez ah, pulsamos simplemente F2, o botn derecho --> Breakpoint --> Toggle o simplemente 2 clicks en la columna "Hex dump" y veremos cmo se
foro.elhacker.net/printpage.html;topic=180886.0 11/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

pone la direccin en rojo. Ya tenemos puesto el punto de ruptura. En este punto, voy a aadir que OllyDBG nos permite poner varios tipos de BP. Hemos visto el ms comn y tpico, pero tambin podra ser necesario que parase en 418E80 solamente cuando por ej. el registro EAX sea igual a 2 (botn derecho --> Breakpoint --> Condicional) y ah pondramos la condicin, que no se va a explicar aqu. Otro tipo de BP son los Hardware Breakpoints. Slo podemos poner 4. Si pulsamos botn derecho --> Breakpoints, veremos que en la ventana de desensamblado podemos poner un Hardware on execution. Para ver los HBP que tenemos podemos ir al men: Debug --> Hardware Breakpoints y ah veremos los que tenemos puestos. Si intentamos poner ms de 4, OllyDBG nos avisar que debemos borrar uno. 3.- Modificar una instruccin Imaginemos que tenemos lo siguiente: 402E40 DEC EAX Despus de analizar el cdigo detenidamente, sabemos que ese DEC EAX (en mi programa) lo que hace es disminuir una vida. Como yo no quiero que me quite una vida, pues voy a modificar ese cdigo. Puedo hacerlo de varias formas: -NOPEAR TODO: Nos ponemos sobre esa linea y pulsamos botn derecho --> binary --> Fill with NOPs y as rpidamente ya tenemos todo lleno de NOPs. -DEC EAX se compone de un slo byte. En la columna dissasembly podemos clickear dos veces y nos saldr una ventana donde podremos modificar el cdigo. Por ej. podramos poner: NOP y tendremos lo mismo que antes, o simplemente INC EAX y nos incrementar EAX u otra cosa que se nos ocurra. -Modificar el byte. En la columna Hex dump, podemos pulsar botn derecho --> Binary --> Edit y podemos modificar el byte. 4.- Ir a MessageBoxA Los ms Newbies desconocen esta opcin. Lo primero que tenemos que asegurarnos es que se haya cargado la librera correspondiente. Me explico. Por ejemplo la funcin MessageBoxA se encuentra en user32.dll. Si nuestro programa no ha cargado user32.dll esto que vamos a hacer no funcionar. Simplemente hacemos como antes cuando quisimos ir a una direccin: pulsar el botn nmero 10 de la siguiente imagen: (http://img183.imageshack.us/img183/4480/botonesollywm3.jpg) o bien, podemos pulsar Ctrl+G o botn derecho --> Goto --> Expresion Y ah escribimos: MessageBoxA, y OllyDBG nos llevar ah. 5.- Poner un comentario Es posible que algn cdigo ya sepamos exactamente lo que hace. Para ver todo mucho ms sencillo podemos poner nuestro propio lenguaje. Por ej. 401200 DEC EAX <-- Quita un da ... 402000 Call 4032EC <-- Call que pone un botn activado etc... De este modo, cuando lleguemos a este cdigo ya sabemos qu hace exactamente todo y no tenemos que volver a analizar. Para poner comentarios, como ya se ha explicado, podemos por ej. pulsar dos veces en la columna "Comment" y se abrir una ventana y ah podremos poner lo que queramos. Esto aunque parezca una tontera, es realmente muy til, sobre todo a la hora de trabajar con programas con mucho cdigo. Tambin nos ayuda a encontrar
foro.elhacker.net/printpage.html;topic=180886.0 12/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

las zonas que nos interesan, ya que podemos buscar nuestros propios comentarios. Para buscar nuestros comentarios pulsamos botn derecho --> Search for --> user-defined comment y podremos seleccionar lo que queramos. Muy til. 6.- Me he movido por el cdigo y ahora no s volver donde estaba antes. Estamos parados en un determinado cdigo. Ahora vamos a una direccin y despus a otra. Podemos volver a las dos anteriores simplemente pulsando la tecla "-" (menos). Si queremos ir ahora para adelante podemos pulsar la tecla "+" e iremos de nuevo a la ltima direccin que estuvimos. Es posible tambin que lo que se quiera sea ir al lugar donde estaba detenido el debugger. Esto es muy fcil, ya que sabemos que el debugger est parado en el valor del registro EIP, por lo tanto podemos cliquear dos veces en este registro e iremos donde est parado nuestro debugger. Podemos tambin pulsar la tecla "C" de la barra de herramientas. 7.- Acabo de entrar en una CALL de una librera. Quiero volver al cdigo de donde fue llamada. Una opcin manual sera ir a cada RET pulsando Ctrl+F9 y despus F7 para pasar el RET y haciendo esto llegaramos a nuestro cdigo donde ha sido llamada la CALL. Hay una opcin que tiene OllyDBG y que nos puede facilitar este trabajo: simplemente pulsando Alt+F9 (Execute till user code). 8.- Quiero que el cdigo se ejecute hasta donde tengo el cursor puesto. Pinchamos (hasta que marque en color) sobre un determinado cdigo y pulsamos simplemente F4. IMPORTANTE: 9.- Ya he hecho los cambios en el OllyDBG, ahora quiero guardar todos los cambios en el mismo ejecutable. Esta pregunta la hace muchsima muchsima gente. Voy a explicar la teora de cmo hay que modificarlo y explicar la forma de hacerlo de manera muy SENCILLA con OllyDBG sin utilizar ningn Editor Hexadecimal y por lo tanto sin calcular el Offset: Imaginemos por ejemplo que en la direccin 401000 tenemos lo siguiente: 401000 PUSH EBP ;push ebp corresponde al byte 55h. Bien, nosotros hemos modificado ese PUSH EBP (55h) y hemos querido dejar un NOP, entonces veramos lo siguiente: 401000 NOP ;nop corresponde a 90h Ya tenemos el cambio que queremos hecho. Ahora viene la pregunta: Cmo puedo guardar el exe (dll o lo que sea) con este nuevo cambio que acabo de hacer? Con OllyDBG lo haremos en tres pasos: 1.-Pulsamos botn derecho (en cualquier lugar en la ventana de desensamblado) y elegimos: Copy to executable --> All modifications 2.-Se abrir una nueva ventana con 4 botones que nos dice lo siguiente: "Copy selection to executable file?" Pulsamos en el botn: "Copy All"
foro.elhacker.net/printpage.html;topic=180886.0 13/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

3.-Y finalmente en la nueva ventana que aparece pulsamos botn derecho y elegimos: "Save file". De este modo tan sencillo ya lo tenemos modificado .

TEORA de este punto 9. Esto que voy a explicar lo considero muy


importante, muy esencial y que todo el mundo, ya seas iniciado o no debe saber. Voy a tratar el punto 9 pero sin OllyDBG y entendiendo todo, y lo vamos a modificar manualmente. Voy a utilizar un programa fcil de conseguir y que nos servir de gua: OllyDBG 1.10. Lo vamos a abrir con un editor de PE (encabezado). Hay muchsimos programas, cada uno que elija el que ms le guste. Nos vamos a ir a ver las secciones y si miramos las del OllyDBG encontraremos lo siguiente:
C digo: N a m e . t e x t . d a t a . t l s . r d a t a . i d a t a . e d a t a . r s r c . r e l o c

V i r t u a lO f f s e t 1 0 0 0 B 0 0 0 0 1 0 B 0 0 0 1 0 C 0 0 0 1 0 D 0 0 0 1 0 F 0 0 0 1 1 1 0 0 0 1 4 7 0 0 0

V i r t u a lS i z e A F 0 0 0 5 B 0 0 0 1 0 0 0 1 0 0 0 2 0 0 0 2 0 0 0 3 6 0 0 0 C 0 0 0

R a wO f f s e to P o i n t e r T o R a w D a t a 6 0 0 A E E 0 0 C C 0 0 0 C C 2 0 0 C C 4 0 0 C E 2 0 0 C F 6 0 0 1 0 5 0 0 0

R a wS i z eo F l a g s S i z e o f R a w D a t a A E 8 0 0 6 0 0 0 0 0 2 0 1 D 2 0 0 C 0 0 0 0 0 4 0 2 0 0 C 0 0 0 0 0 4 0 2 0 0 5 0 0 0 0 0 4 0 1 E 0 0 4 0 0 0 0 0 4 0 1 4 0 0 4 0 0 0 0 0 4 0 3 5 A 0 0 4 0 0 0 0 0 4 0 B E 0 0 5 0 0 0 0 0 4 0

Columna por columna: - Name: Indica el nombre de la seccin. - Virtual Offset o Relative Virtual Address: Es la direccin virtual relativa a la Image Base donde se encuentra la seccin. Muchas veces la veremos nombrada como RVA (Relative Virtual Address. No hay que confundirla con la Virtual Address ya que a esta ltima se le suma la Image Base. La mayora de los programas tienen la Image Base igual a 400000h. Ejemplo de esto ltimo: (datos del OllyDBG que hemos abierto con un Editor PE) Image Base: 400000h RVA donde comienza la seccin ".text": 1000 Por lo tanto la Direccin Virtual (Virtual Address) donde comienza la seccin .text es: Image Base + RVA = VA; VA = 400000 + 1000 = 401000. Esto nos quiere decir que la seccin .text comienza en la direccin virtual 401000. Se puede comprobar si abrimos un OllyDBG con otro OllyDBG y vamos a esta direccin: veremos que es la primera instruccin... - Virtual Size: Es el tamao virtual de la seccin. Por ej. el tamao virtual de la seccin .text son AF000h bytes. - Raw Offset o PointerToRawData: indica el desplazamiento dentro del archivo donde comienza la seccin. Ahora que ya sabemos un poco voy a entrar un peln en detalle. Sabemos lo siguiente: -que la Image Base es 400000h -que la seccin .text comienza en el RVA 1000 -que la primera instruccin (desensamblarlo) es JMP SHORT 00401012 que corresponde a los 2 bytes: EB 10 -que esta primera instruccin se encuentra en VA 401000

foro.elhacker.net/printpage.html;topic=180886.0

14/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

Ejemplo1 Pregunta: Estos dos bytes (EB 10) que se encuentran en RVA 1000, Dnde se encuentran realmente en el archivo ejecutable? Bien, esto nos lo dice: Raw Offset o PointerToRawData. En este caso es sencillo ya que estos 2 bytes (EB 10), se encuentran justo en el inicio de la seccin .text, por lo tanto, dichos bytes se encuentran en el archivo en el offset: 600h. Para comprobar esto que acabo de decir, voy a abrir al OllyDBG en un editor hexadecimal y voy a ir al offset 600h:
C digo: 0 0 0 0 0 5 F 0 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 . . . . . . . . . . . . . . . . 0 0 0 0 0 6 0 0 E B1 06 66 23 A4 32 B2 B4 84 F4 F4 B9 0E 92 80 1 . f b : C + + H O O K . ( .

Perfecto, ah tenemos los dos bytes. Ejemplo2 Bueno, acabamos de ver un ejemplo muy sencillo, vamos a hacer otro que es lo que nos vamos a encontrar normalmente, y es lo que hay que aprender a entender. Voy a abrir el OllyDBG con el OllyDBG y me voy a ir a una direccin cualquiera...:
C digo: 0 0 4 6 1 2 3 E 0 0 4 6 1 2 4 1 8 B4 E1 4 8 B5 31 4 M O VE C X , D W O R DP T RD S : [ E S I + 1 4 ] M O VE D X , D W O R DP T RD S : [ E B X + 1 4 ]

Tenemos de nuevo los siguientes datos: -Image Base = 400000h -RVA (.text) = 1000h -Raw Offset = 600h En la direccin virtual 46123E encontramos los bytes 8B 4E 14. Como la Image Base es 400000, tenemos que: 46123E - 400000 = 6123E que es una direccin virtual relativa (RVA). Sabemos que la VA 46123E se encuentra dentro de la seccin .text. Cmo s esto? Pues porque si miris la tabla que puse del editor de PE tenemos que: -La RVA del comienzo de la seccin .text = 1000h -El tamao virtual (virtual size) de la seccin .text = AF000 Por lo tanto 6123E es mayor que 1000 y menor que AF000, por esto se encuentra dentro de .text. Sigo. Como la seccin .text comienza (RVA) en 1000h tenemos que: 6123E - 1000 = 6023E que es el desplazamiento en la seccin .text, por este motivo, podemos sumar 6023E al offset de inicio de la seccin .text en el mismo ejecutable, as: 600h (Raw Offset) + 6023E (desplazamiento) = 6083E (offset buscado) Veamoslo mirando un editor hexadecimal:
C digo: 0 0 0 6 0 8 3 0 7 36 DB 80 10 00 00 0E B6 68 3F A0 67 52 F8 B4 E s m . . . . f . u / N 0 0 0 6 0 8 4 0 1 48 B5 31 48 1E 2F F0 00 00 08 1E 1F F0 00 00 0 . S . . . . . . . . .

Viendo esto, podemos poner una frmula general: VA = Direccin Virtual que queremos saber dnde se encuentra en el ejecutable. RVA (.seccin) = Es la RVA del comienzo de la seccin en la que se encuentra VA Raw Offset (.seccin) = Es el offset del comienzo de la seccin en la que se
foro.elhacker.net/printpage.html;topic=180886.0 15/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

encuentra VA. ImageBase = Es la ImageBase VA - ImageBase - RVA(.seccin) + Raw Offset (.seccin) Con esta frmula voy a hacer el ltimo ejemplo: Ejemplo3 VA = 4BF008 (bytes que contiene: 44 F2 4B...) Est dentro de la seccin .data RVA (.data) = B0000h Raw Offset (.data) = AEE00h Image Base = 400000h 4BF008 - 400000 - B0000 + AEE00 = BDE08 (offset buscado, veamos en un editor hexadecimal a ver:)
C digo: 0 0 0 B D E 0 0 0 00 00 00 00 40 00 00 04 4F 24 B0 00 00 00 00 0 . . . . . . . . D K . . . . . 0 0 0 B D E 1 0 0 00 00 00 00 F0 00 00 00 D0 00 00 04 60 00 00 0 . . . . . . . . . . . . F . . .

SizeofRawData: Es el tamao de la seccin en el propio archivo ejecutable. No quiero entrar ms en detalle porque nos salimos de lo que se quiere explicar en este tutorial, pero esto que se ha mostrado pienso que tiene que quedar bien claro. Ttulo: 2. Ventana de Dump Publicado por: karmany en 24 Diciembre 2007, 00:16

2.0 Ventana de Dump - OllyDBG:


(http://img166.imageshack.us/img166/5294/20080721163627tq9.jpg) Esta subventana es muy til tambin. En ella podemos representar los valores hexadecimales, de muchas formas diferentes: - Podemos ver el carcter ASCII que representa al valor hex. - Podemos ver el cdigo UNICODE que representa a los valores hex. - Podemos ver la representacin de punto flotante. - Podemos ver las direcciones que pueden representar. - Podemos ver incluso el cdigo desensamblado, aunque para esto ya tenemos nuestra ventana de desensamblado. - Podemos ver un PE header con todos sus datos. Y muchas opciones ms. Una ventana muy requetetil, que nos va a ayudar enormemente en nuestra labor. Esta subdividida en varias columnas. Normalmente se suele utilizar la apariencia de la imagen anterior, que est dividida en 3 columnas. Address --> direccin donde se encuentran los bytes Hex dump --> los valores hexadecimales ASCII --> el carcter ASCII del valor hexadecimal Como se observa en la imagen, he utilizado un tamao por fila de 16 bytes. Con otras visualizaciones el manejo es similar.
foro.elhacker.net/printpage.html;topic=180886.0 16/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

Si pulsamos sobre cualquier valor hexadecimal o sobre cualquier dato ASCII, OllyDBG sombrear el valor hexadecimal y el cdigo ASCII al que corresponde. Podemos seleccionar el nmero de bytes que queramos. Si pulsamos con el botn derecho del ratn veremos un men similar al de la ventana de desensamblado. Explicar todas las opciones o todo lo que podemos hacer podra resultar bastante extenso, montono, aburrido y poco eficaz, as que pienso que lo mejor es practicar con unos sencillos ejemplos.

Ttulo: Re: Taller de Cracking desde 0 Publicado por: karmany en 5 Febrero 2008, 23:21

2.1 Ejemplos en Ventana de Dump - OllyDBG:


Vamos a realizar unos pequeos ejerccios: 1.- Modificar un byte: Vamos a partir de la imagen anterior: (http://img166.imageshack.us/img166/5294/20080721163627tq9.jpg) Podemos observar por ejemplo, que en la direccin 402BDC tenemos el byte: 56h que corresponde a la "V". Se trata de modificarlo y sustituir la "V" por ejemplo por una "R" para que nos quede "RB5!". Lo primero que haremos ser seleccionar el byte correspondiente (simplemente pulsando con el botn izquierdo del ratn sobre el byte). Ahora tenemos varias opciones: 1-Pulsar botn derecho del ratn y seleccionar binary --> Edit: (http://img183.imageshack.us/img183/1584/20080721164604yp0.jpg) Se nos abrir una nueva ventana: (http://img397.imageshack.us/img397/2811/20080721165034lc4.jpg) Como se observa, en el ttulo tenemos la direccin y podemos modificar directamente el cdigo ASCII, UNICODE o el mismo byte en hexadecimal. Como es lgico si se pone algo en UNICODE nos aadir un nuevo byte. Como queremos poner una "R", nos pondremos sobre la "V" (ASCII) y simplemente la sustituimos. Pulsamos en "OK" y veremos cmo nuestra modificacin se ha puesto en rojo y nos ha sustituido la "V" por la "R" (en hexadecimal: 4C(L) por 52(R). 2-Simplemente cuando est seleccionado nuestro byte pulsamos cualquier dgito hexadecimal y se nos abrir de nuevo la ventana anterior. Estaremos modificando directamente el valor hexadecimal. As que podremos teclear 52 y pulsamos Enter y solucionado. Aqu he modificado solamente un byte, pero de igual modo podemos seleccionar los bytes que nosotros queramos modificar y editarlos posteriormente de esta forma explicada.

foro.elhacker.net/printpage.html;topic=180886.0

17/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

2.- Sobre cadena de texto: Cadenas de texto = Strings (Ingls) Cuando en la ventana de Dump vemos alguna string podemos conocer su longitud ya que al final de la misma, ya sea ASCII o UNICODE veremos un 0(cero)(ASCII) o dos 0 (ceros)(UNICODE). Por ejemplo en UNICODE "karmany" es:
C digo: 6 B0 06 10 07 20 06 D0 06 10 06 E0 07 90 00 0 k a r m a n y

3.- Quiero copiar 4 bytes y pegarlos en otro sitio: OllyDBG tiene esta opcin tan necesaria que es poder copiar los bytes que nosotros queramos y pegarlos en cualquier otro lugar. Por ejemplo, en la imagen anterior de la ventana de dump, vamos a copiar los 4 bytes (1 dword) que hay en 402BD0 (56 42 35 21) y los vamos a pegar en 401264. Primero seleccionamos el/los bytes que queramos (en este ejemplo slo seleccionaremos 4. Ahora pulsamos botn derecho del ratn y seleccionamos: Binary --> Binary Copy. Y de esta forma tan sencilla ya los tenemos copiados. Ahora seleccionamos los 4 bytes donde vamos a pegarlos. Si seleccionamos menos (por ej. 3), OllyDBG slo modificar los que hemos seleccionado y simplemente pulsamos botn derecho del ratn sobre ellos y pulsamos en: Binary --> Binary Paste. Esta opcin es muy til sobre todo cuando ests haciendo algn injerto y tienes que ir modificando el cdigo. Yo incluso hice una fuerza bruta para solucionar un crackme y los bytes que utiliz los tengo guardados en un txt. De este modo acoplarlos despus a un nuevo crackme es mucho ms sencillo que empezar de cero. 4.- He seleccionado un gran nmero de bytes. Quiero saber cmo ponerlos todos a 0 (cero) o cmo ponerlos todos a FFh: Es muy sencillo, cuando ya tengamos todos los bytes que queramos pulsamos botn derecho del ratn y seleccionamos Binary se nos desplegar un submen y ah tenemos las 2 opciones: -sustituir lo seleccionado por ceros: Fill with 00's -sustituir lo seleccionado por FF: Fill with FF's Como observaris, en la ventana de dump pone sustituir por FF mientras que en la ventana de desensamblado, pone sustituir por 90 (NOP). 5.- Me gustara poner un Breakpoint a un byte cuando sea modificado Imaginemos que tenemos un byte igual a 04. Imaginemos que son las vidas de un juego y que cuando nos quitan una vida ese 4 disminuir a 3. Podramos averiguar cundo se quita esa vida simplemente poniendo un breakpoint cuando el byte sea modificado. Esto se hace as: -Seleccionamos el byte en cuestin (el 04 en este ejemplo) -pulsamos botn derecho del ratn y seleccionamos Breakpoint -Tenemos dos opciones: Poner un BP (breakpoint). Seleccionamos Memory, on write Poner un HBP (Hardware BreakPoint). Seleccionamos Hardware, on write --> Byte Para saber cuntos HBP tenemos puestos podemos seleccionar en el men de
foro.elhacker.net/printpage.html;topic=180886.0 18/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

OllyDBG en: Debug --> Hardware breakpoints 5.- Aparece una cadena muy larga y la quiero copiar A veces, es posible que queramos copiar una cadena larga que aparezca en la ventana de dump. Copiarla dgito a dgito podra ser un poco largo y podramos equivocarnos as que podemos seleccionar dicha cadena y pulsar botn derecho del ratn --> copy --> To clipboard (tambin podemos usar el tpico Ctrl+C). Creamos o abrimos un documento de texto y pegamos. 6.- Cmo ir a una direccin determinada Simplemente pulsamos el botn derecho del ratn y seleccionamos Goto --> expresion (lo mismo que pulsar Ctrl+G). En el siguiente cuadro ponemos la direccin que queramos y pulsamos Ok. 7.- Cmo examinar el encabezado (PE header) de un programa desde OllyDBG OllyDBG tiene opciones muy interesantes. Modemos decirle a OllyDBG que nos muestre toda la informacin de un PE header (encabezado). Normalmente en un programa cualquiera el PE header aparece en la direccin 400000 (generalmente). Por este motivo, nos dirigimos a la direccin 400000 en la ventana de dump y ahora le vamos a decir a OllyDBG que nos muestre dicha informacin como PE header: Botn derecho del ratn --> especial --> PE header Para volver despus como estaba antes: Botn derecho del ratn --> Hex --> Hex/ASCII (16 bytes)

Ttulo: 3.0 Ventana de Registros Publicado por: karmany en 27 Julio 2008, 12:50

3.0 Ventana de Registros - OllyDBG:


(http://img180.imageshack.us/img180/91/regvenrv2.jpg) Los registros son utilizados para guardar o acceder rpidamente a distintos valores. Este tema de los registros ya fue explicado muy bien por Shaddy. La Ventana de Registros nos da informacin acerca de los mismos. Podemos observar qu es lo que contiene cada registro, modificar su contenido, incrementar o disminuirlo en una unidad rpidamente y un largo etc... El registro EIP es la direccin en la que nos encontramos y muchas veces en esta ventana de registros si esa direccin coincide con una funcin, o con cualquier dato relevante, nos puede mostrar dnde se encuentra. En este caso vemos que se encuentra en el Entry Point. Tiene en su parte superior una barra que nos permite visualizar 3 vistas diferentes simplemente pulsando en la misma. -Registers (FPU) -Registers (MMX) -Registers (3DNow!) Para lo que estamos aprendiendo yo recomiendo que lo dejis en Registers (FPU), tal como se ve en la imagen. La diferencia con las otras dos vistas es que en esta (FPU) se muestran los registros ST(0)....ST(7) que son utilizados para realizar operaciones de punto flotante. Slo quedaros con eso no entraremos en
foro.elhacker.net/printpage.html;topic=180886.0 19/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

ms detalles. Registers (FPU): Vamos a explicar todo lo que hay en esta ventana. Para ello echaremos un vistazo a la imagen que he puesto. Lo primero que aparece son los registros que ya conocemos y sus respectivos valores que almacenan:
C digo: E A X0 0 0 0 0 0 0 0 E C X0 0 1 3 F F B 0 E D X7 C 9 1 E B 9 4n t d l l . K i F a s t S y s t e m C a l l R e t E B X7 F F D F 0 0 0 E S P0 0 1 3 F F C 4 E B P0 0 1 3 F F F 0 E S IF F F F F F F F E D I7 C 9 2 0 7 3 8n t d l l . 7 C 9 2 0 7 3 8 E I P0 0 4 0 1 1 C 0C r a c k m e _ . < M o d u l e E n t r y P o i n t >

Podemos observar como dije antes que estamos detenidos en el EntryPoint.(EP) Despus nos encontramos con:
C digo: C1 P0 A0 Z0 S1 T0 D0 O0

Son lo denominado Flags o Banderas. Se ponen unicamente a 0 o 1 y se modifican cuando ha ocurrido una determina instruccin(operacin). Por ejemplo, el Flag Z o Flag Cero (vemos Z 0) se pone a cero cuando se ejecuta una operacin y el resultado ha sido cero. Veamos: Imaginemos que EAX vale 00000001; eax = 1 El flag Z est de momento a cero. Y tenemos lo siguiente: DEC eax ;con lo que eax valdr 0. Tras esta instruccin el Flag Z se pone a 1... Para este tutorial no entrar a explicar todos los Flags. Seguimos. A la derecha de estos Flags vemos lo siguiente:
C digo: E S0 0 2 33 2 b i t0 ( F F F F F F F F )>g e n e r a lod es t r i n g C S0 0 1 B3 2 b i t0 ( F F F F F F F F )>d ec d i g o S S0 0 2 33 2 b i t0 ( F F F F F F F F )>d es t a c k D S0 0 2 33 2 b i t0 ( F F F F F F F F )>d ed a t o s F S0 0 3 B3 2 b i t7 F F D E 0 0 0 ( F F F )> s e g m e n t o sd e f .p o re lu s u a r i o G S0 0 0 0N U L L>s e g m e n t o sd e f .p o re lu s u a r i o

Son los denominados Registros de Segmento utilizados para direcciones de memoria. No los utilizaremos. Y finalmente:
C digo: S T 0e m p t yU N O R MB C E 00 1 0 5 0 1 0 40 0 6 C 0 0 6 F S T 1e m p t y0 . 0 0 0 0 0 1 6 4 3 9 0 7 6 2 0 0 4 7 0 e 4 9 3 3
foro.elhacker.net/printpage.html;topic=180886.0 20/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

S T 2e m p t y0 . 0 S T 3e m p t y0 . 0 S T 4e m p t y0 . 0 S T 5e m p t y0 . 0 S T 6e m p t y0 . 0 S T 7e m p t y0 . 0

Que son utilizados como ya coment para realizar operaciones de punto flotante. Este tema es muy interesante y la representacin de estos nmeros an ms. Sobre todo en los de precisin doble. No entrar en ms detalles, aunque he mostrado para qu valen.

Ttulo: 3.1 Ejemplo Ventana de Registros Publicado por: karmany en 27 Julio 2008, 14:03

3.1 Ejemplos en Ventana de Registros - OllyDBG:


1.- Incrementar o disminuir en una unidad un registro cualquiera: Vamos a incrementar en uno el registro eax: Seleccionamos el registro, pulsamos botn derecho del ratn --> increment. Simplemente podemos hacerlo pulsando la tecla +. Vamos a disminuir en uno el registro ebx: Seleccionamos el registro, pulsamos botn derecho del ratn --> decrement. Simplemente podemos hacerlo pulsando la tecla -. 2.- Poner un registro cualquiera a 0 o 1: Imaginemos que eax vale FFFFFFF2. Si seleccionamos el registro y pulsamos botn derecho del ratn veremos la opcin: -Zero ;para poner el registro a cero -Set to 1 ;para poner el registro a uno

3.- El registro ebx tiene una direccin. Quiero ir a esa direccin en el dump rpidamente: Imaginemos que ebx (o cualquier otro registro) vale 402000. Queremos ir a esa direccin en la Ventana del Dump. Simplemente seleccionamos el registro ebx y pulsamos botn derecho del ratn --> Follow in dump

4.- El registro ebx tiene una direccin. Quiero ir a esa direccin en la ventana de desensamblado: Imaginemos igual que antes que ebx (o cualquier registro) vale 402001. Queremos ir a esa direccin en la ventana de desensamblado. Simplemente seleccionamos dicho registro ebx, y pulsamos botn derecho del ratn --> Follow in disassembler

5.- Quiero modificar el registro EIP: Debes saber que si modificas dicho registro, modificas la posicin en la que se encuentra parado el debugger. Hay que tener cuidado y saber lo que se hace.
foro.elhacker.net/printpage.html;topic=180886.0 21/22

22/05/13

Imprimir Pgina - Taller de Cracking desde cero - (actualizado: 27.julio.2008)

6.- Se ha realizado una operacin y el resultado es cero. Ahora estoy en un JNZ, y no salta. No quiero modificar el JNZ a JE. Qu puedo hacer? Este es el flag Z explicado antes, as que si una operacin ha dado cero, pues el flag Z se habr puesto a 1 y por lo tanto una instruccin JNZ no saltar. Podemos seleccionar el flag Z y pulsamos botn derecho --> Reset y veremos cmo al cambiar el flag Z ya JNZ salta.

En contruccin Perdonar las molestias


Powe re d by SMF 1.1.18 | SMF 2006-2008, Sim ple Machine s

foro.elhacker.net/printpage.html;topic=180886.0

22/22

También podría gustarte