24/08/2010
Imprimir Página - Taller de Cracking d…
Foro de elhacker.net Programac ión => Ingeniería Ingeniería Inversa => Mensaje iniciado por: Shaddy Shaddy en 17 Septiembre 2007, 2 3:54 3:54 Título: Taller Taller de Cracking Cracking de sde cero - ( actua lizado: 27.jul 27.julio.20 io.2008) 08) Public Public ado por: Shaddy en 17 Septiem bre 2007, 23:54 23:54
Taller de Cracking desde desd e 0 por karmany y Shadd S haddyy INTRODUCCIÓN ¿Qué es esto del Taller de Cracking desde 0? Bien, después de juntarnos ambos, ambos, y dada nuestra experiencia, experiencia, hemos hemos pensado que lo mejor para que una persona empiece a conocer este fantástico mundo de la ingeniería inversa, es enseñar las cosas más básicas. 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 más básicos. Estamos seguros, que a gente avanzada también 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 más básico, no podemos hablar de debugger sin conocer nada de ensamblador y no podemos hablar de ensamblador sin ni siquiera saber qué es el código máquina.
Título: Re: Taller de Crac king desde 0 Public Public ado por: karmany en 18 Septiem bre 2007, 22:05 22:05
Del Código Código Máqui na al Lenguaje Ensamblador Realmente, ¿qué es lo que entiende un "ordenador"? Como Como se ha dic dic ho mil millones lones de veces: veces : 0 (ceros) y 1 (unos) (unos) -- - > (bits) El código o lenguaje máquina consta de cadenas de estos 0 y 1, que el microprocesador entiende directamente. Una y sólo una secuencia de estos 0 y 1 realizará una determinada operación. Programar directamente en este sistema binario, como se puede uno imaginar, puede resultar muy muy duro y es muy fácil equivocarse. …elhacker.net/printpage.html;topic=1…
1/22
24/08/2010
Imprimir Página - Taller de Cracking d…
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 c ual utiliza utiliza nemot nemotéc écnicos nicos (normalm (normalmente ente abreviaturas de palabras palabras en inglés) inglés) que se utilizan utilizan para defini def inirr una determ det erminada inada instrucc ión. Por ejemplo: A DD A , B . Se suma a A el valor de B y el resultado se guardaría guardar ía en (A). Para los que recién empiezan, imaginemos estos valores de A y B: A=3 B =2 por lo tanto, tras AD D A , B , nos quedaría: A=5 B =2
En este punto, alguien podrá pensar: -Bueno, escribir un programa en lenguaje ensamblador no es que sea tarea fácil, además existen muchos otros lenguajes de alto nivel que nos pueden facilitar enormemente las cosas a la hora de programar... entonces... ¿Por qué en ingeniería inversa hay que aprender lenguaje ensamblador? ensamblador ? Si abrieramos cualquier programa y echáramos una ojeada al código, observaríamos el lenguaje máquina, independientemente del lenguaje de programación con que haya sido programado (compilado). Es lógico, 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 máquina obtienen el lenguaje ensamblador, que ya es mucho más entendible al ser humano. Estos programas se denominan desensambladores. Entendido todo esto, vamos a dar los primeros pequeños pasos en ensamblador, del inglés Assembly. Título: Re: Taller de Crac king desde 0 Public Public ado por: Shaddy en 18 Septiem bre 2007, 23:38 23:38
Practicando Assembly 1.- Introducción Es importante antes de adentrarnos en el mundo de los Depuradores, Depuradores , Desensambladores y demás herramientas que conozcamos y tengamos una buena noción de lo que es el Assembly . Empezarem Empezaremos os suave, s uave, haciendo hac iendo breves breves ejemplos y poco a poco. 2.- Instrucciones Instrucciones B ásica s: Parte I Comenzaremos por las instrucciones más básicas, con breves explicaciones y ejemplos: MOV , CMP , TEST, TEST, ADD, SUB, SUB, INC, DEC. M OV : Se utiliza para mover un dato de un registro a otro. …elhacker.net/printpage.html;topic=1…
2/22
24/08/2010
Imprimir Página - Taller de Cracking d…
Ej: MOV A, B. El valor de A pasaría a ser igual que el valor de B. CM P: Compara el valor de dos registros. Ej: CMP A, B. Se efectúa una comparación entre A y B. TEST: Compara el valor de dos registros. Ej: TEST A, B. Se efectúa una comparación 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 guardaría en (A). SUB : Resta el valor de dos registros almacenandolo en el primero. Ej: SUB A, B. Se rest a a A el valor de B y el resultado se guardaría en (A). INC : Incrementa el valor en 1 de un registro. Ej: INC A. Se incrementaría el valor de A en 1. DEC : Decrementa el valor en 1 de un registro. Ej: DEC A. Se decrementaría el valor de A en 1. 2.- Los Registros: Parte I Antes de adentrarnos en los Registros quiero hacer un breve c omentario sobre las API. Bien, en cualquier programa compilado bajo windows se utilizan unas denominadas API, éstas son básicamente las que forman todo lo que percibes, así como ventanas, botones, movimientos del ratón, etc... y también todas las acciones que haces. La manera de llamarlas es básicamente una estructura. No la explicaré de momento porque es pronto para ello pero os haré un breve ejemplo: Citar PUSH EAX PUSH EDX CALL ls trcatA
Imaginemos esas instrucciones, en éste caso digamos que mete EAX y EDX en la pila (que lo que explicaré más adelante) para así tratar los valores antes de llamar a la API lstrcat que se encarga de c oncatenar (juntar) 2 cadenas. En éste caso si EAX apunta a "hola" y EDX a " mundo" una vez ejecutada la API en EAX quedaría 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: …elhacker.net/printpage.html;topic=1…
3/22
24/08/2010
Imprimir Página - Taller de Cracking d…
EAX, ECX, EDX, EBX. 1.- EA X: Acumulador - Como ya expliqué, una vez ejecutada una API, se suelen devolver principalmente el o los resultados a EA X. 2.-EB X: Base - Éste se suele utilizar como Base en los algoritmos. Es decir, si EB X vale 10, esa será la BASE de la cantidad de vec es que se hac e un proceso específico. 3.-ECX: Contador - Éste sería en el ejemplo anterior el que hace de contador, con una instrucción tipo I NC ECX cada vez se iría sumando de 1 en 1 hasta llegar al número del registro BASE (EBX) 10, así que utilizando estos dos últimos ejemplos se haría durante 10 veces una funcion (por ejemplo, multiplicar por 3 diez veces). Ej: Citar Notas: EAX = 1 ; EBX = 10
Inicio: MUL EAX, 3 ; MUL: Multiplica 2 registros almacenando en e l primero. INC ECX CMP ECX, EBX JNE Inicio ; JNE: es un salto condicional (JNE: JUMP IF NOT EQUAL / Salta si no es igual) que va hacia la dirección que le indiques siempre y cuando el resultado de la comparación anterior sea desigüal .
4.-EDX : Datos - Éste es utilizado también antes de invocar a una API para darle los datos. 3.- LA PILA: Pa rte I ¿Qué es la PILA? - Técnicamente es una estructura de datos, del tipo LIFO (del inglés Last In First Out, último en entrar, primero en salir). Texto extraído de la wikipedia.. y vosotros os preguntaréis, ¿que esto de una estructura?, Bien. Imaginad que formamos una ventana, o por ejemplo, el típico mensaje de texto. En éste caso es la API MessageBoxA . (http://r.i.elhacker.net/cache? url=http://www.homeandlearn.co.uk/net/images/messageboxDelete.jpg) En éste caso vemos 3 partes claramente identificables: - Título : "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 código máquina), ésto sería visualizado así: …elhacker.net/printpage.html;topic=1…
4/22
24/08/2010
Imprimir Página - Taller de Cracking d…
1 MessageBoxA es la API encargada de lanzar ese mensaje tipo "caja de texto" que puse en la imagen.
Citar PUSH Título PUSH Cuerpo PUSH Botones CALL MessageBoxA
Entonces ahí vemos que cada elemento es primero insertado en la pila mediante la instrucción PUSH. La pila tiene la cualidad de lo último que metes, es lo primero que sacas. Es decir, en nuestro caso ahora la pila tendría ésta forma. Las direcciones son imaginarías, normalmente la pila se visualiza con las corre spondientes direcciones hacia donde apuntan (pueden apuntar a una ca dena de texto que contenga el título
00401005 Botones 00401000 Cuerpo 00401020 Título de manera que si ahora nos encontráramos con una instrucción tipo POP EAX extraeríamos Botones por ser la última que se introdujo hacia el REGISTRO EAX el cual hemos indicado mediante la instrucción. É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 instrucción CALL MessageBoxA y ésta se encontrara por ejemplo en la dirección 402500 (vamos a hacer un ejemplo de donde la dirección en la que se sitúan las instrucciones): Atendiendo al ejemplo de antes añado las mismas instrucciones pero con sus respec tivas direcciones imaginarias. Citar 402500| PUSH Título 402504| PUSH Cuerpo 402508| PUSH Botones 40250A | CALL MessageBoxA 40250F | MOV EAX, EBX
En éste caso una vez se ejecute la instrucción CALL MessageBoxA, se almacenará en la pila también la dirección de RETORNO, es decir, la dirección en la que regresará una vez haya sido llamado. Atendiendo al ejemplo de antes la pila en éste caso quedaría así. 00401008 00401005 00401000 00401020
RETURN to 4 0 2 5 0 F Botones Cuerpo Título
Así como vemos, también se a almacenado la dirección hacia donde tendrá que volver despues del MessageBoxA. Por el momento vamos t eniendo nociones de c ada parte pero sin profundizar en nada, si no lo entendéis completamente no os preocupéis, es normal, a medida que lo vayamos viendo todo tomará forma y os saldrá mecánicamente. 4.- LOS REGI STROS: PARTE I I [ PRÁCTI CAS]
Ah o r a i m a g i n e m o s v a r i a s s i t u a c i o n e s , v o y a e s cr i b i r u n a s in s t r u c ci o n e s y …elhacker.net/printpage.html;topic=1…
5/22
24/08/2010
Imprimir Página - Taller de Cracking d…
q u i e r o q u e m e d i g á i s e l v a l o r d e l o s r e g i s t r o s f i n a l e s. ( s i q u e r é i s r e s p o n d e r a u n p r i v a d o m e a l e g r a r á v e r q u e s e g u i s e l cu r s o , a u n q u e s e a m o s le n t o s : P) . Cita de: Ejercicio 1 MOV EAX, 1530h ADD EAX, 1000h SUB EAX, 500h MOV 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 según tamaño: EAX (32 bits) se descompone en: AX (16BIT) que éste mismo se descompone en: AH y AL (4 Bit cada uno) Para que veáis 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 instrucción tipo: Citar MOV AL, 5
Sabemos que sólamente hay una posibilidad, pero tambien debemos saber a que parte de EA X corresponde, porque si fuese AX por ejemplo ya cambiaría la posición del movimiento. Mas adelante veremos como se trabaja con "punteros", y ahí deberemos tener bien claro éstas correspondencias: DWORD -> EAX WORD -> AX BY TE -> AH y AL Citar Ejercicio 2 : MOV EAX, 00004932h ADD AX, 45h SUB AL, 0Ah
5.- SALTOS CONDICIONALE S Y BANDERAS: PA RTE I [PRÁCTICA S] …elhacker.net/printpage.html;topic=1…
6/22
24/08/2010
Imprimir Página - Taller de Cracking d…
¿Que son los saltos condicionales? ¿Que son las banderas? Los saltos condicionales son instrucciones que al ejecutarse hacen que el flujo se traslade a la dirección 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: Citar CMP EAX, EBX JE 401000
la primera instrucc ion compara el contenido de EB X con el contenido de EA X, 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 comparación 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 función de las operaciones aritméticas que vayan generandose a lo largo del programa, y que hay instrucciones que actuan en función de las mismas, veamos que tipos de satos hay: JE JNE o JNZ JB JBE JP JPE JL JLE [CONTINUARÁ] EN CONSTRUCCIÓN Título: Re: Taller de Crac king desde 0 Publicado por: karmany en 28 Septiem bre 2007, 22:38
OllyDBg - Asíé ndon os con OllyDBG Pequeña Introducción. Habiendo una gran cantidad de debuggers en la actualidad, ¿Por qué vamos a hacer la introducción con OllyDBG? Ciertamente existen muchísimos debuggers, pero OllyDBG, desde su aparición, tuvo muchos adeptos; tal vez por su sencillez, por su intuición, 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 información y OllyDBG creemos que es un debugger del que se ha hablado muchísimo y solamente con ver "Introducción al OllyDBG desde cero" realizado por Ricardo …elhacker.net/printpage.html;topic=1…
7/22
24/08/2010
Imprimir Página - Taller de Cracking d…
Narvaja ya tenemos una base impresionante no sólo para empezar, sino para obtener un nivel más que aceptable. OllyDBG es un debugger con el que hemos estado muchísimas horas, por este motivo, nos va a facilitar enormemente nuestra labor. La idea de este: "asíéndonos con OllyDBG" es iniciar a todo forero en su uso e ir perdiendo el miedo a utilizarlo. Posteriormente ya se podrán tratar otros temas o leer otros tutoriales o... utilizar otros programas...
Presenta ción de OllyDBG. OllyDBG es principalmente un debugger para aplicaciones a 32 bits en Microsoft Windows. Es un debugger en Ring3. Tiene muchísimas otras opciones e incluso es posible la utilización de plugins (o si eres programador hacerlos tú mismo) que hacen de él un programa verdaderamente potente. Para conocer sus características podemos visitar su página Web: http://www.ollydbg.de/ Para descargar el programa podemos descargar la versión 1.10 básica, sin ningún plugin y ninguna modificación desde su página 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 más y con los plugins más 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, también llamada "ventana del desensamblador") y la podemos seleccionar de este modo: -En el menu: View --> CPU -Pulsando Alt + C -O bien pulsando el botón "C" de (CPU) que hay en la barra de herramientas. Si dejamos el ratón sobre este botón nos mostrará abajo a la izquierda: Show CPU (Alt+C)
Su interfaz es la siguiente: (http://r.i.elhacker.net/cache? url=http://img251.imageshack.us/img251/7964/ollycpuus8.jpg) Fig.1
Podemos dividirla del siguiente modo: (http://r.i.elhacker.net/cache? url=http://img170.imageshack.us/img170/6183/ventanapopepb2.jpg) Imagen original de The Pope (Fig.2)
…elhacker.net/printpage.html;topic=1…
8/22
24/08/2010
Imprimir Página - Taller de Cracking d…
Vamos a examinar más detenidamente las ventanas marcadas en color, una por una:
Título: Ventana de desensamblado Publicado por: karmany en 18 Noviem bre 2007, 17:59
1.0 Ven tana 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 botón derecho dentro de la ventana de desensamblado (CPU) y seleccionando: Appearanc e --> Show bar o Appearance --> Hide bar respectivamente. La imagen de la ventana de desensamblado con la barra descriptiva comentada es la siguiente: (http://r.i.elhacker.net/cache? url=http://img353.imageshack.us/img353/9960/20080721162048qw4.jpg) 1) La primera columna "Address" muestra la dirección donde se ejecutará el código. 2) La segunda columna "Hex dump" muestra los bytes que forman la instrucción 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 más. 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 función o API etc... que nos pueden ayudar muchísimo. Tomemos la primera linea: Address Hex dump 40125C 68 2C 14 40 00
Disassembly PUSH 40142C
Comment
La dirección donde se ejecuta ese PUSH 40142C es 40125C. Los bytes que forman la instrucción 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, cómo 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 dirección en rojo. Para ver todos los breakpoints que hemos colocado podemos verlos en: View --> Breakpoints o Alt+B Podemos también modificar los bytes, copiarlos, pegarlos, convertirlos a ceros o en NOP's etc... pulsando botón derecho y seleccionando Binary y sus submenus. Disassembly: …elhacker.net/printpage.html;topic=1…
9/22
24/08/2010
Imprimir Página - Taller de Cracking d…
Si cliqueamos dos veces (o pulsamos la tecla del espacio), se abrirá una pequeña ventana en donde podremos escribir nosotros mismos la instrucción que queramos. Tiene una opción: "Fill will NOP's": Si se tilda rellenará con NOP's lo que quede de la instrucción que hemos modificado, por el contrario, si no se tilda, lo que quede de código será de nuevo ensamblado dando posibles resultados inesperados. (Y o recomiendo tildarla). Una de las cosas que hacen más fácil escribir en ensamblador desde el propio OllyDBG, es que permite escribir instrucciones sin poner por ej. el tamaño(BYTEWORD-DWORD). Por ejemplo, sea la siguiente instrucción: 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 automáticamente pondrá: MOV EAX ,DWORD PTR DS:[400000]. Si nos equivocamos siempre tenemos la opción: Botón derecho -->Undo Selection para restaurar lo original. Comment: OllyDBG rellena adecuadamente todos los comentarios necesarios, que hacen que el código sea mucho más entendible. Nosotros del mismo modo, podemos modificar cualquier comentario y poner lo que nosotros queramos...a fin de que sea más fácil después entender todo. Simplemente cliqueamos dos veces sobre esa columna y aparecerá una pequeña ventana que pondrá de título: "Add comment" o "Change comment" (añadir comentario o modificar comentario). Si modificamos un comentario que tenía ya OllyDBG, podemos simplemente borrar el nuestro y automáticamente volverá a aparecer el original. Poner un comentario propio es realmente muy útil y además nos puede ayudar posteriormente a recordar ese punto... por ejemplo, imaginemos lo siguiente: 0040100A DEC EAX , podría ser que en EAX hubiera por ej. el número de vidas y en este momento nos la disminuye en una (DEC EAX). Podríamos poner de comentario: "Quita una vida". Si después no nos acordamos de la dirección podemos buscarla pulsando botón derecho --> Seach for --> user-defined comment y ahí veremos nuestro "Quita una vida". La ventana de desensamblado es la más utilizada, así que hay que conocerla un poco más 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://r.i.elhacker.net/cache? url=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 diálogo para abrir un archivo). Los siguientes y por orden tienen la siguiente función: 1.- Equivale a pulsar "Ctrl+F2" o ir al menú "Debug --> restart". Reinicia de nuevo la depuración del programa. Según la configuración 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. …elhacker.net/printpage.html;topic=1…
10/22
24/08/2010
Imprimir Página - Taller de Cracking d…
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 instrucción por instrucción entrando en todas las call y subrutinas. 6.- Equivale a pulsar "F8" o ir al menú "Debug --> Step Over". Hace ir al debuger instrucción por instrucción 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 botón 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 dirección, y tras aceptar, en la ventana de desensamblado podremos ver el código que hay en dicha dirección. Tenemos muchas más opciones pulsando el botón derecho, o seleccionando en los diferentes menús. Veremos las más importantes. Aunque para los recién iniciados sea un poco lioso recordar todo, en el siguiente apartado haremos unos sencillos ejemplos utilizando lo más básico. Veremos cómo manejarnos en la ventana de desensamblado.
Título: Ejemplos ve ntana de dese nsamblado Publicado por: karmany en 18 Noviem bre 2007, 18:14
1.1 Ejemplos en V entan a de desensamblado OllyDBG: Vamos a manejarnos un poco con lo más básico en esta ventana. Voy a abrir un programa cualquiera con el OllyDBG y pongo una imagen de la ventana de desensamblado: (http://r.i.elhacker.net/cache? url=htt p://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 librería MSVBVM60, por lo tanto podemos ya imaginarnos que se t rata de un programa c ompilado c on Visual Basic. Vamos a hacer unos pequeños ejercícios: 1.- Ir a la direcc ión 418E80. -Como expliqué en el párrafo anterior podemos o bien pulsar el botón número 10 de la siguiente imagen: (http://r.i.elhacker.net/cache? url=http://img183.imageshack.us/img183/4480/botonesollywm3.jpg) o bien, podemos pulsar Ctrl+G o botón derecho - -> Goto --> Expresion . De estas 3 formas se nos abrirá una ventana y ahí podremos poner la dirección a la que queremos ir: 418E80: (http://r.i.elhacker.net/cache? url=http://img377.imageshack.us/img377/5466/20080721163247fq0.jpg) …elhacker.net/printpage.html;topic=1…
11/22
24/08/2010
Imprimir Página - Taller de Cracking d…
pulsamos Ok y nos llevará directamente a esa dirección. 2.- Poner un Breakpoint (BP - lugar donde parará e l debugger) en 418E80 Lo primero vamos a la dirección 418E80, explicado en el punto anterior. Una vez ahí, pulsamos simplemente F2, o botón derecho - -> Breakpoint --> Toggle o simplemente 2 clicks en la columna "Hex dump" y veremos cómo se pone la dirección en rojo. Ya tenemos puesto el punto de ruptura. En este punto, voy a añadir que OllyDBG nos permite poner varios tipos de BP. Hemos visto el más común y típico, pero también podría ser necesario que parase en 418E80 solamente cuando por ej. el registro EAX sea igual a 2 ( botón derecho -- > Breakpoint --> Condicional) y ahí pondríamos la condición, que no se va a explicar aquí. Otro tipo de BP son los Hardware Breakpoints. Sólo podemos poner 4. Si pulsamos botón 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 Brea kpoints y ahí veremos los que tenemos puestos. Si intentamos poner más de 4, OllyDBG nos avisará que debemos borrar uno. 3.- Modificar una instrucción Imaginemos que tenemos lo siguiente: 402E40 DEC EAX Después de analizar el código 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 código. Puedo hacerlo de varias formas: -NOPEAR TODO: Nos ponemos sobre esa linea y pulsamos botón derecho --> binary --> F ill with NOPs y así rápidamente ya tenemos todo lleno de NOPs. -DEC EAX se compone de un sólo byte. En la columna dissasembly podemos clickear dos veces y nos saldrá una ventana donde podremos modificar el código. Por ej. podríamos 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 botón derecho --> Binary --> Edit y podemos modificar el byte. 4.- Ir a Mes sageBoxA Los más Newbies desconocen esta opción. Lo primero que tenemos que asegurarnos es que se haya cargado la librería correspondiente. Me explico. Por ejemplo la función 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 dirección: pulsar el botón número 10 de la siguiente imagen: (http://r.i.elhacker.net/cache? url=http://img183.imageshack.us/img183/4480/botonesollywm3.jpg) o bien, podemos pulsar Ctrl+G o botón derecho - -> Goto --> Expresion Y ahí escribimos: MessageBoxA, y OllyDBG nos llevará ahí. 5.- Poner un comentario Es posible que algún código ya sepamos exactamente lo que hace. Para ver todo mucho más sencillo podemos poner nuestro propio lenguaje. Por ej. 401200 DEC EAX <-- Quita un día ... 402000 Call 4032EC <-- Call que pone un botón activado …elhacker.net/printpage.html;topic=1…
12/22
24/08/2010
Imprimir Página - Taller de Cracking d…
etc... De este modo, cuando lleguemos a este código 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 tontería, es realmente muy útil, sobre todo a la hora de trabajar con programas con mucho código. También nos ayuda a encontrar las zonas que nos interesan, ya que podemos buscar nuestros propios comentarios. Para buscar nuestros comentarios pulsamos botón derecho --> Search for --> user-defined comment y podremos seleccionar lo que queramos. Muy útil. 6.- Me he movido por el código y ahora no sé volver donde estaba a ntes. Estamos parados en un determinado código. Ahora vamos a una dirección y después 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 dirección que estuvimos. Es posible también que lo que se quiera sea ir al lugar donde estaba detenido el debugger. Esto es muy fácil, 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 nuest ro debugger. Podemos t ambién pulsar la tecla "C" de la barra de herramientas. 7.- Acabo de entrar en una CALL de una librería. Quiero volve r al código de donde fue llamada . Una opción manual sería ir a cada RET pulsando Ctrl+F9 y después F7 para pasar el RET y haciendo esto llegaríamos a nuestro código donde ha sido llamada la CALL. Hay una opción que tiene OllyDBG y que nos puede facilitar este trabajo: simplemente pulsando Alt+F9 (Execute till user code). 8.- Quiero que el código se ejec ute hasta do nde tengo el cursor puesto. Pinchamos (hasta que marque en color) sobre un determinado código y pulsamos simplemente F4. IMPORTANTE: 9.- Ya he hecho los cam bios en el OllyDBG, ahora quiero guardar todos los cambios en el mismo e jecutable. Esta pregunta la hace muchísima muchísima gente. Voy a explicar la teoría de cómo hay que modificarlo y explicaré la forma de hacerlo de manera muy SENCILLA con OllyDBG sin utilizar ningún Editor Hexadecimal y por lo tanto sin calcular el Offset: Imaginemos por ejemplo que en la dirección 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 veríamos lo siguiente: 401000 NOP ;nop corresponde a 90h Ya tenemos el cambio que queremos hecho. Ahora viene la pregunta: ¿Cómo puedo guardar el exe (dll o lo que sea) con este nuevo cambio que acabo de hacer? Con OllyDBG lo haremos en tres pasos: …elhacker.net/printpage.html;topic=1…
13/22
24/08/2010
Imprimir Página - Taller de Cracking d…
1.-Pulsamos botón 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 botón: "Copy All" 3.-Y finalmente en la nueva ventana que aparece pulsamos botón derecho y elegimos: "Save file". De este modo tan sencillo ya lo tenemos modificado .
TEORÍA 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 fácil de conseguir y que nos servirá de guía: OllyDBG 1.10. Lo vamos a abrir con un editor de PE (encabezado). Hay muchísimos programas, cada uno que elija el que más le guste. Nos vamos a ir a ver las secciones y si miramos las del OllyDBG encontraremos lo siguiente: Código: Name .text .data .tls .rdata .idata .edata .rsrc .reloc
Virtual Offset
Virtual Size
1000 B0000 10B000 10C000 10D000 10F000 111000 147000
AF000 5B000 1000 1000 2000 2000 36000 C000
Raw Offset o PointerToRawData 600 AEE00 CC000 CC200 CC400 CE200 CF600 105000
Raw Size o SizeofRawData AE800 1D200 200 200 1E00 1400 35A00 BE00
Flags 60000020 C0000040 C0000040 50000040 40000040 40000040 40000040 50000040
Columna por columna: -Name: Indica el nombre de la sección. -Virtual Offse t o Relative Virtual Address: Es la dirección virtual relativa a la Image Base donde se encuentra la sección. 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 mayoría 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 sección ".text": 1000 Por lo tanto la Dirección Virtual (Virtual Address) donde comienza la sección .text es: Image Base + RVA = VA; VA = 400000 + 1000 = 401000. Esto nos quiere decir que la sección .text comienza en la dirección virtual 401000. Se puede comprobar si abrimos un OllyDBG con otro OllyDBG y vamos a esta dirección: veremos que es la primera instrucción... -Virtual Size: Es el tamaño virtual de la sección. Por ej. el tamaño virtual de la sección .text son AF000h bytes. -Raw Offset o PointerToRawData: indica el desplazamiento dentro del archivo donde comienza la sección. Ahora que ya sabemos un poco voy a entrar un pelín …elhacker.net/printpage.html;topic=1…
14/22
24/08/2010
Imprimir Página - Taller de Cracking d…
en detalle. Sabemos lo siguiente: -que la Image Base es 400000h -que la sección .text comienza en el RVA 1000 -que la primera instrucción (desensamblarlo) es JMP SHORT 00401012 que corresponde a los 2 bytes: EB 10 -que esta primera instrucción se encuentra en VA 401000 Ejemplo1 Pregunta: Estos dos bytes (EB 10) que se encuentran en RVA 1000, ¿Dónde se encuentran realmente en el archivo ejecutable? Bien, esto nos lo dice: Raw Offset o PointerToRawData. En este c aso es sencillo ya que estos 2 bytes (EB 10), se encuentran justo en el inicio de la sección .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: 000005F0 00000600
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 EB 10 66 62 3A 43 2B 2B 48 4F 4F 4B 90 E9 28 01
................ ë.fb:C++HOOK.é(.
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 dirección cualquiera...: Código: 0046123E 00461241
8B 4E 14 8B 53 14
MOV ECX,DWORD PTR DS:[ESI+14] MOV EDX,DWORD PTR DS:[EBX+14]
Tenemos de nuevo los siguientes datos: -Image Base = 400000h -RVA (.text) = 1000h -Raw Offset = 600h En la dirección virtual 46123E encontramos los bytes 8B 4E 14. Como la Image Base es 400000, tenemos que: 46123E - 400000 = 6123E que es una dirección virtual relativa (RVA). Sabemos que la VA 46123E se encuentra dentro de la sección .text. ¿Cómo sé esto? Pues porque si miráis la tabla que puse del editor de PE tenemos que: -La RVA del comienzo de la sección .text = 1000h -El tamaño virtual (virtual size) de la sección .text = AF000 Por lo tanto 6123E es mayor que 1000 y menor que AF000, por esto se encuentra dentro de .text. Sigo. Como la sección .text comienza (RVA) en 1000h tenemos que: 6123E - 1000 = 6023E que es el desplazamiento en la sección .text, por este motivo, podemos sumar 6023E al offset de inicio de la sección .text en el mismo ejecutable, así: 600h (Raw Offset ) + 6023E (desplazamiento) = 6083E (offset buscado) Veamoslo mirando un editor hexadecimal: Código:
00060830
73 6D B8 01 00 00 00 EB 66 83 FA 06 75 2F 8B 4E
…elhacker.net/printpage.html;topic=1…
sm¸....ëfƒú.u/‹N
15/22
24/08/2010
Imprimir Página - Taller de Cracking d…
00060840
14 8B 53 14 81 E2 FF 00 00 00 81 E1 FF 00 00 00
.‹S..âÿ....áÿ...
Viendo esto, podemos poner una fórmula general: VA = Dirección Virtual que queremos saber dónde se encuentra en el ejecutable. RVA (.sección) = Es la RVA del comienzo de la sección en la que se encuentra VA Raw Offset (.sección) = Es el offset del comienzo de la sección en la que se encuentra VA. ImageBase = Es la ImageBase VA - Image Bas e - RVA(.sección) + Raw Offset (.secc ión) Con esta fórmula voy a hacer el último ejemplo: Ejemplo3 VA = 4BF008 (bytes que contiene: 44 F2 4B...) Está dentro de la sección .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: 000BDE00 000BDE10
00 00 00 00 04 00 00 00 44 F2 4B 00 00 00 00 00 00 00 00 00 0F 00 00 00 0D 00 00 00 46 00 00 00
........DòK..... ............F...
SizeofRawData : Es el tamaño de la sección en el propio archivo ejecutable. No quiero entrar más 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. Título: 2. Ventana de Dump Publicado por: karmany en 24 Diciemb re 2007, 00:16
2.0 Ven tan a de Dump - OllyDBG: (http://r.i.elhacker.net/cache? url=http://img166.imageshack.us/img166/5294/20080721163627tq9.jpg) Esta subventana es muy útil también. En ella podemos representar los valores hexadecimales, de muchas formas diferentes: - Podemos ver el carácter ASCII que representa al valor hex. - Podemos ver el código UNICODE que representa a los valores hex. - Podemos ver la representación de punto flotante. - Podemos ver las direcciones que pueden representar. - Podemos ver incluso el código desensamblado, aunque para esto ya tenemos nuestra ventana de desensamblado. - Podemos ver un PE header con todos sus datos. Y muchas opciones más. Una ventana muy requeteútil, que nos va a ayudar enormemente en nuestra labor. Esta subdividida en varias columnas. Normalmente se suele utilizar la apariencia …elhacker.net/printpage.html;topic=1…
16/22
24/08/2010
Imprimir Página - Taller de Cracking d…
de la imagen anterior, que está dividida en 3 columnas. Address --> dirección donde se encuentran los bytes Hex dump --> los valores hexadecimales ASCII --> el carácter ASCII del valor hexadecimal Como se observa en la imagen, he utilizado un tamaño por fila de 16 bytes. Con otras visualizaciones el manejo es similar. Si pulsamos sobre cualquier valor hexadecimal o sobre cualquier dato ASCII, OllyDBG sombreará el valor hexadecimal y el código ASCII al que corresponde. Podemos seleccionar el número de bytes que queramos. Si pulsamos con el botón derecho del ratón veremos un menú similar al de la ventana de desensamblado. Explicar todas las opciones o todo lo que podemos hacer podría resultar bastante extenso, monótono, aburrido y poco eficaz, así que pienso que lo mejor es practicar con unos sencillos ejemplos.
Título: Re: Taller de Crac king desde 0 Publicado por: karmany en 05 F ebrero 2008, 23:21
2.1 Ejemplos en Ven tan a de Dump - OllyDBG: Vamos a realizar unos pequeños ejercícios: 1.- Modificar un byte : Vamos a partir de la imagen anterior: (http://r.i.elhacker.net/cache? url=http://img166.imageshack.us/img166/5294/20080721163627tq9.jpg) Podemos observar por ejemplo, que en la dirección 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 botón izquierdo del ratón sobre el byte). Ahora tenemos varias opciones: 1ª-Pulsar botón derecho del ratón y seleccionar binary --> Edit: (http://r.i.elhacker.net/cache? url=http://img183.imageshack.us/img183/1584/20080721164604yp0.jpg) Se nos abrirá una nueva ventana: (http://r.i.elhacker.net/cache? url=htt p://img397.imageshack.us/img397/2811/20080721165034lc4.jpg) Como se observa, en el título tenemos la dirección y podemos modificar directamente el código ASCII, UNICODE o el mismo byte en hexadecimal. Como es lógico si se pone algo en UNICODE nos añadirá un nuevo byte. Como queremos poner una "R", nos pondremos sobre la "V" (ASCII) y simplemente la sustituimos. Pulsamos en "OK" y veremos cómo nuestra modificación se ha puesto en rojo y nos ha sustituido la "V" por la "R" (en …elhacker.net/printpage.html;topic=1…
17/22
24/08/2010
Imprimir Página - Taller de Cracking d…
hexadecimal: 4C(L) por 52(R). 2ª-Simplemente cuando esté seleccionado nuestro byte pulsamos cualquier dígito hexadecimal y se nos abrirá de nuevo la ventana anterior. Estaremos modificando direct amente 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. 2.- Sobre cade na de texto : Cadenas de texto = Strings (Inglés) 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: 6B 00 61 00 72 00 6D 00 61 00 6E 00 79 00 00 k a r m a n y
3.- Quiero copiar 4 bytes y pe garlos en otro sitio: OllyDBG tiene esta opción 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 sólo seleccionaremos 4. Ahora pulsamos botón derecho del ratón 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 sólo modificará los que hemos seleccionado y simplemente pulsamos botón derecho del ratón sobre ellos y pulsamos en: Binary --> Binary Paste. Esta opción es muy útil sobre todo cuando estás haciendo algún injerto y tienes que ir modificando el código. 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 después a un nuevo crackme es mucho más sencillo que empezar de cero. 4.- He selecc ionado un gran número de bytes . Quiero saber cómo ponerlos todos a 0 (cero) o cómo ponerlos todos a F Fh: Es muy sencillo, cuando ya tengamos todos los bytes que queramos pulsamos botón derecho del ratón 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 observaréis, en la ventana de dump pone sustituir por FF mientras que en la ventana de desensamblado, pone sustituir por 90 (NOP). 5.- Me gustaría poner un Breakpoint a un byte cuando s ea m odificado …elhacker.net/printpage.html;topic=1…
18/22
24/08/2010
Imprimir Página - Taller de Cracking d…
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. Podríamos averiguar cuándo se quita esa vida simplemente poniendo un breakpoint cuando el byte sea modificado. Esto se hace así: -Seleccionamos el byte en cuestión (el 04 en este ejemplo) -pulsamos botón derecho del ratón 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 cuántos HBP tenemos puestos podemos seleccionar en el menú de OllyDBG en: Debug --> Hardware breakpoints 5.- Aparece una cade na muy larga y la quiero copiar A veces, es posible que queramos copiar una cadena larga que aparezca en la ventana de dump. Copiarla dígito a dígito podría ser un poco largo y podríamos equivocarnos así que podemos seleccionar dicha cadena y pulsar botón derecho del ratón --> copy --> To clipboard (también podemos usar el típico Ctrl+C). Creamos o abrimos un documento de texto y pegamos. 6.- Cómo ir a una dirección dete rminada Simplemente pulsamos el botón derecho del ratón y seleccionamos Goto --> expresion (lo mismo que pulsar Ctrl+G). En el siguiente cuadro ponemos la dirección que queramos y pulsamos Ok. 7.- Cómo examinar el encabezado (PE header) de un programa desde OllyDBG OllyDBG tiene opciones muy interesantes. Modemos decirle a OllyDBG que nos muestre toda la información de un PE header (encabezado). Normalmente en un programa cualquiera el PE header aparece en la dirección 400000 (generalmente). Por este motivo, nos dirigimos a la dirección 400000 en la ventana de dump y ahora le vamos a decir a OllyDBG que nos muestre dicha información como PE header: Botón derecho del ratón - -> especial --> PE header Para volver después como estaba antes: Botón derecho del ratón - -> Hex --> Hex/ASCII (16 bytes)
Título: 3.0 Ventana de Registros Publicado por: karmany en 27 Julio 2008, 12:50
3.0 Ve ntan a de R egistros - OllyDBG: (http://r.i.elhacker.net/cache? url=http://img180.imageshack.us/img180/91/regvenrv2.jpg) Los registros son utilizados para guardar o acceder rápidamente a distintos valores. Este tema de los registros ya fue explicado muy bien por Shaddy. La Ventana de Registros nos da información acerca de los mismos. Podemos observar qué es lo que contiene cada registro, modificar su contenido, incrementar o disminuirlo en una unidad rápidamente y un largo etc... El registro EIP es la dirección en la que nos encontramos y muchas veces en esta ventana de registros si esa dirección coincide con una función, o con …elhacker.net/printpage.html;topic=1…
19/22
24/08/2010
Imprimir Página - Taller de Cracking d…
cualquier dato relevante, nos puede mostrar dónde 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 dejéis 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. Sólo quedaros con eso no entraremos en más detalles. Registers (F PU): 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: EAX ECX EDX EBX ESP EBP ESI EDI EIP
00000000 0013FFB0 7C91EB94 ntdll.KiFastSystemCallRet 7FFDF000 0013FFC4 0013FFF0 FFFFFFFF 7C920738 ntdll.7C920738 004011C0 Crackme_.
Podemos observar como dije antes que estamos detenidos en el EntryPoint.(EP) Después nos encontramos con: Código: C P A Z S T D O
1 0 0 0 1 0 0 0
Son lo denominado Flags o Banderas. Se ponen unicamente a 0 o 1 y se modifican c uando ha oc urrido una determina instrucc ión(operación). Por ejemplo, el Flag Z o Flag Cero (vemos Z 0) se pone a cero cuando se ejecuta una operación 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 ea x ;con lo que eax valdrá 0. Tras esta instrucción 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: …elhacker.net/printpage.html;topic=1…
20/22
24/08/2010 Código: ES CS SS DS FS GS
0023 001B 0023 0023 003B 0000
Imprimir Página - Taller de Cracking d… 32bit 0(FFFFFFFF) -> general o de string 32bit 0(FFFFFFFF) -> de código 32bit 0(FFFFFFFF) -> de stack 32bit 0(FFFFFFFF) -> de datos 32bit 7FFDE000(FFF) ->segmentos def. por el usuario NULL -> segmentos def. por el usuario
Son los denominados Registros de Segmento utilizados para direcciones de memoria. No los utilizaremos. Y finalmente: Código: ST0 ST1 ST2 ST3 ST4 ST5 ST6 ST7
empty empty empty empty empty empty empty empty
-UNORM BCE0 01050104 006C006F 0.0000016439076200470e-4933 0.0 0.0 0.0 0.0 0.0 0.0
Que son utilizados como ya comenté para realizar operaciones de punto flotante. Este tema es muy interesante y la representación de estos números aún más. Sobre todo en los de precisión doble. No entraré en más detalles, aunque he mostrado para qué valen.
Título: 3.1 Ejemplo Ve ntana de Registros Publicado por: karmany en 27 Julio 2008, 14:03
3.1 Ejemplos en Ven tana de Regi stros - OllyDBG: 1.- Incrementar o dism inuir en una unidad un registro cua lquiera: Vamos a incrementar en uno el registro eax: Seleccionamos el registro, pulsamos botón derecho del ratón --> increment. Simplemente podemos hacerlo pulsando la tecla +. Vamos a disminuir en uno el registro ebx: Seleccionamos el registro, pulsamos botón derecho del ratón --> decrement. Simplemente podemos hac erlo pulsando la tecla -. 2.- Poner un registro cualquiera a 0 o 1: Imaginemos que eax vale FFFFFFF2. Si seleccionamos el registro y pulsamos botón derecho del ratón veremos la opción: -Zero ;para poner el registro a cero -Set to 1 ;para poner el registro a uno
3.- El registro ebx tiene una dirección. Quiero ir a esa dirección en el dump rápidamente: Imaginemos que ebx (o cualquier otro registro) vale 402000. Queremos ir a esa dirección en la Ventana del Dump. Simplemente seleccionamos el registro ebx y pulsamos botón derecho del ratón --> Follow in dump
…elhacker.net/printpage.html;topic=1…
21/22
24/08/2010
Imprimir Página - Taller de Cracking d…
4.- El registro ebx tiene una direcc ión. Quiero ir a esa direcc ión en la ventana de desensamblado: Imaginemos igual que antes que ebx (o cualquier registro) vale 402001. Queremos ir a esa dirección en la ventana de desensamblado. Simplemente seleccionamos dicho registro ebx, y pulsamos botón derecho del ratón --> Follow in disassembler
5.- Quiero m odificar e l registro EIP: Debes saber que si modificas dicho registro, modificas la posición en la que se encuentra parado el debugger. Hay que tener cuidado y saber lo que se hace.
6.- Se ha realizado una ope ración y el resultado es cero. Ahora estoy en un JNZ, y no sa lta. No quiero mo dificar el J NZ a JE. ¿Qué puedo hacer? Este es el flag Z explicado antes, así que si una operación ha dado cero, pues el flag Z se habrá puesto a 1 y por lo tanto una instrucción JNZ no saltará. Podemos seleccionar el flag Z y pulsamos botón derecho --> Reset y veremos cómo al cambiar el flag Z ya JNZ salta.
En contrucción Perdonar las molestias Powered b y SMF 1.1.11 | SMF © 2006-2008, Simple Ma chines LLC
…elhacker.net/printpage.html;topic=1…
22/22