
Artículo · Ingeniería Inversa
Introducción a la ingeniería inversa Capitulo I
Objetivo
* Reconocimiento de la herramienta Ollydbg.
* Familiarizarnos con los comandos básicos de Asembler
* Solucionado un crackmes.
Introducción
Para muchos el término cracking, es relacionado a lo ilegal, y que no se debería practicar, en este artículo se explicara de manera básica y práctica, para tener una mayor compresión se resolverá en cada artículo un crackmes, estos crackmes son desarrollados para fines educativos o también como retos para los crackers.
Herramienta
Adjunto este enlace para que puedan desarrollar el primer tema:
https://mega.nz/#!ERASXJgD!oIUFOvhSfwJezcuSdutQJNSKvoAVY25szBu8WNBdcdg
Ollydbg (http://www.ollydbg.de/odbg110.zip)
Crackmes
El Ataque
Los comandos básicos de Assembler, lo veremos ejecutando Ollydbg luego depuramos el crackme.
Lo primero que veremos en el entorno de Ollydbg son los Registros, dichos registros esta conformado por 32 bits, estos son:
EAX: Acumulador; ECX: Contador; EDX: Datos; EBX: Base; ESP: Apuntador de Pila; EBP: Apuntador Base; ESI: Índice Fuente; EDI: Índice Destino; EIP: Apuntador a la siguiente Función.
Instrucciones Lógicas: AND, NEG, NOT, OR, TEST, XOR.
Instrucciones Aritméticas: ADC, ADD, DIV, IDIV, MUL, IMUL, SBB, SUB.
Instrucciones CALL y RET:
CALL: Es un proceso que contiene una función u otra call, es el comando que más se analizara en los siguientes capítulos, por ejemplo antes de una condición donde validara nuestra clave, se realizar un llamado (CALL), en donde analizara nuestra serial o clave.
RET: Este comando nos permite retornar de un llamado (CALL), es decir que es el final de un call para poder proceder a la siguiente línea.
Instrucción de Comparación: Se utiliza para comparar dos variables o registros, afectando a las banderas (FLAGS), este comando es muy utilizando comparando nuestra serial ingresado y con el serial correcto, es muy usado en el cracking, la sintaxis es:
CMP VALORA, VALORB
Instrucciones de los saltos: Se utiliza para saltar hacia el “GOOD BOY” o “BAD BOY”, estos términos se refiere a la ventana de “Software Registrado” o “Clave invalido”, se utilizara bastante esta instrucción para saltar o evadir el “BAD BOY”, de lo cual se mencionara los saltos más usados, en el transcurso del capítulo se observara diferentes saltos y se explicara.
JMP: Realiza un salto sin importar la condición de la banderas (FLAGS).
JE: Sata si es igual o la bandera Z es igual a Cero.
JNE (JNZ): Salta si no es igual o la bandera Z no es Cero.
Instrucciones de Transferencia: Se utiliza para mover un registro o contenido, se utilizara mayormente para transferir nuestra serial a un registro y luego procede a comparar con la clave.
MOV VALORA, VALORB -> Quiere decir que el VALORB se moverá a VALORA.
Instrucciones de Pila: Dicha instrucción sirve para alojar temporalmente en la pila y recuperarlo.
PUSH: Agrega el valor en la Pila.
POP: Extrae el valor hacia el Registro.
Al ataque
En esta parte se resolverá un crackmes, explicando paso a paso, y se dejara un crackmes básico para que lo puedan resolver, y se responderá todas las dudas de los capítulos, primero procederemos a ejecutar OLLYDBG:
Antes de proceder a crackerar, necesitamos realizar una copia de seguridad del crackmes, por si los cambios realizados puedan afectar el funcionamiento del software.
Procederemos a ejecutar nuestro primer crackmes y el objetivo es encontrar el serial o parchar el software, vayamos a File->Open->Seleccionar el crackmes.
A primera vista observamos 4 ventanas que son:
Desensamblado: En esta parte se observara el código del crackmes a bajo nivel, al principio será algo nuevo para los nuevos que inicia este mundo, pero con el tiempo verán que es perseverancia, en esta venta se verán 4 columnas, la primera es la dirección de memoria, dicha dirección de memoria varia por equipo, la segunda columna es el código de operaciones es lo que lee y entiende el equipo, la tercera columna es código assembler es lo que nosotros los humanos entendemos, y finalmente los comentarios.
DUMP: Nos muestra el contenido de la dirección de memoria, nos muestra tres columnas, la primera dirección de memoria, la segunda es el valor Hexadecimal y el tercero el código ASCII.
REGISTRO: Como se explicó líneas arribas contiene los registros de que la CPU maneja EAX, EBX, ECX, EDX, etc.
STACK: Nuevamente se explicó aloja los valores temporalmente para recuperarlo en los registros.
Antes de resolver el crackmes, vayamos a recolectar información básica, ejecutamos el crackmes, ingresamos la clave: 121212, de la cual la clave no es correcta y nos muestra la ventana “Maybe, you should try again, it’s sooo easy!!”, este es el famosos “BAD BOY” o “CHICO MALO”.
Procedamos con el siguiente paso, lo primero que debemos buscar es el texto “Maybe, you should try again, it’s sooo easy!!”, lo bueno de OLLYDBG nos brinda la opción de buscar los string, hagamos clic derecho en el Desensamblador -> Search for -> All referenced text strings.
Vemos todos los string que tiene el crackmes y si nos damos cuenta podemos ver nuestra string “Maybe, you should try again, it’s sooo easy!!”, hagamos doble clic en el string en la dirección de memoria 0040126E.
Vemos en la ventana Desensamblador que el string “Maybe, you should try again, it’s sooo easy!!”, se encuentra en la dirección de memoria 0040126E (Cuadro Rojo), y a la vez vemos el string “You entered the right password” en la dirección de memoria 00401258 (Cuadro verde), esta ubicación se denomina la ZONA CALIENTE, ya que encontramos los dos MessageBox(Chico Bueno y Malo), por ultimo vemos en la dirección 0040124F(Cuadro amarillo) la instrucción JNZ, quiere decir que realizara un salto a la dirección 00401267(Cuadro azul), es decir que ese salto es la decide si aparecerá el chico bueno o malo.
Luego de este análisis agregamos un BreakPoint (BP) con la tecla F2 en la dirección 0040124F, o clic derecho en la línea donde deseamos agregar el BP, BreakPoint->Toggle (F2), la función del BP, es detenerse el proceso, para poder realizar otro análisis, luego presionamos “F9”, o PLAY, para ejecutar el crackmes y agregamos nuestra clave: “121212”, por supuesto que no es la clave correcta, y hacemos clic en el botón “Check”, y veremos que sucede.
Se observa que después de hacer clic en el botón Check, se detiene en la dirección 0040124F, además se encuentra sombreado y en el Ollydbg en la parte inferior derecha nos muestra en un cuadro de color amarillo la palabra Pausa. Entonces quiere decir que en nuestro BP agregado es en donde se detuvo. ☺ , ahora en este punto podemos deducir que :
JNZ : Salta si Z=0 y No salta si Z=1
Por ahora presionamos “F8”, para ver cuál sería la siguiente línea a ejecutar, este proceso se llama Tracear ya que veremos línea por línea lo que se ejecuta. En este caso salto hacia la dirección 00401267, en este punto vemos que se ejecutara el MessageBoxA de BAD BOY.
Ahora presionamos “F9” o play y vemos que nos aparecer el BAD BOY.
Aceptamos el MessageBox del Bad boy e ingresamos nuevamente la clave: “141414”, y damos clic en Check y nuevamente se detiene en nuestro BreakPoint en la dirección 0040124F en este punto es donde decide si salta al Bad Boy o Good Boy, como el primer caso se observó que salto al Bad Boy.
Recordamos un poco: JNZ : Salta si Z=0 y No salta si Z=1, La bandera Z es la famosa bandera o flag(Cuadro de color Verde), donde decide si JNZ se activa o no, en este caso vamos a modificar el valor de la bandera de Cero a Uno, y así veremos si salta o no?, Como veras en la parte inferior nos muestra el texto “Jump is NOT taken”, es decir que no saltara.
Para poder validar que no saltara pasaremos a tracear con la tecla “F8” o hacemos clic en el cuadro de color verde, y veremos la siguiente línea que se ejecutara, en este punto podemos presionar “F9” o Play, y eureka nos apareció el GOOD BOY.
Y como vemos nos aparece el GOOD BOY, se puede decir que llegamos a parcharlo.
Lo que debemos hacer ahora es modificar esa línea de instrucción JNZ de la dirección 0040124F, y decirle que cualquier palabra que ingresemos en la validación nos muestre como valido dicho clave. Lo bueno de Ollydbg es que nos permite modificar la clave a nuestro antojo. Así que procederemos a modificar, primero seleccionemos la línea a modificar en mi caso es JNZ, que se encuentra en la dirección 0040124F (Como veras en la flecha de color azul), presionamos la tecla de barra espaciadora o hacemos doble clic sobre la instrucción a modificar y nos abre una ventana llamado Assembler at 0040124F (la dirección es diferente para cada equipo), en este punto podemos agregar la instrucción contraria a JNZ, ahora la pregunta ¿Cuál sería?
La repuesta es que el opuesto de JNZ es JE, por lo tanto decido cambiar el código, por ahora se pondrá el Check de “Fill with NOP’s”, en los siguientes capítulos se explicara su función. Luego de cambiar el código hacemos clic en Assemble.
Después: Observamos que la instrucción modificada de pinto de color rojo, hagamos una prueba si nos sirvió la modificación.
Ingresamos como clave: “151515”, se entiende que esta no es clave, pero se entiende que con la modificación debería enviarnos el MessageBox del GOOD BOY.
Presionamos el boton Check y se detuvo en el BP, luego presionamos la tecla “F8”, para ver cual seria la siguiente instrucción que se ejecuta, como observamos, no se produce el salto.
Presionamos “F9” o PLAY, y eureka, nos pareció que el GOOD BOY, entonces estamos en buen camino, ahora la otra pregunta sera ¿Como guardo mi modificación y que se ejecute sin problemas?.
Y la repuesta es hacer clic derecho en la dirección 0040124F con la instrucción JE (Es la linea modificada de color rojo), para luego ir a Copy to executable-> Selection.
Como observamos este punto nos muestra todo el código del crackme como también nuestra modificación, se utilizara bastante este proceso, ya que es la etapa final del reto.
Hacemos clic derecho en cualquier de las instrucciones y vayamos a Save file, y lo guardaremos como CRACKMEPATCH.exe
Como se observa se alojara en la misma ruta en donde aloje mi crackme por eso necesito guardarlo como otro nombre, ademas ayuda a ver que tipo de cracking se realizo.
Al guardar nuestro primer Crackme resuelto, pasaremos a ejecutar el CRACKMEPATCH.EXE, para validar si se ejecuta sin problema.
Y nos funciono sin ningún problema, esto seria todo por el momento, en el proximo capitulo se explicara otro método en donde podemos obtener la clave, se dejara como practica un crackme básico, se recomienda seguir los mismos pasos.
Gracias a Backtrack Academy por publicar mis artículos y un gran saludo al Maestro Ricardo Narvaja.
Saludos Cordiales HAppy Cracking.
¿Quieres aprender estas técnicas en profundidad?
Continúa tu ruta con Pentesting .

Escrito por
Rafael PeruCrackersEstudiante de la ingenieria Inversa usando las herramientas de Ollydbg y el actual IDA PRO, actualmente me encuentro investigando sobre Creacion de Exploit, con animo de ayudar a las personas que les interesa el mundo del reversing, :)


