Docly Child

5.2.1. OllyDbg: Fundamentos

Tabla de contenidos:

OllyDbg (Debugging)

OllyDbg es un depurador de código ensamblador que permite hacer debugging en ficheros ejecutables para el formato PE (Portable Executable) de Windows de 32 bits (se recomienda haber leído el punto anterior para comprender estos términos). Aunque pueda considerarse algo desfasado, sigue siendo la herramienta más utilizada para iniciarse en la ingeniería inversa de software de forma práctica. En el momento de escribir esto, los desarrolladores de OllyDbg afirmaban (en 2014) estar creando una nueva versión de este software desde cero, con el objetivo de poder realizar el debugging en ejecutables de 64 bits. Como no hay noticias de este evento, en todo caso, existen otros softwares de depuración de código ensamblador como por ejemplo:

  • GDB (GNU Debuger): Admite diferentes lenguajes de programación además de ensamblador. Es ampliamente utilizado en sistemas Linux.
  • WinDbg: Herramienta desarrollada por Windows.
  • IDA PRO: Muy utilizado en la comunidad de seguridad informática para el análisis de malware, siendo una herramienta muy potente.
  • Radare2: Es de código abierto e incluye muchas opciones además del depurador de código ensamblador.
  • GHIDRA: Herramienta desarrollada por la NSA (Agencia Nacional de Seguridad de Estados Unidos).

A pesar de la oferta y que el proyecto parece estar abandonado, Ollydbg es probablemente la mejor herramienta para introducirse en el debugging por su fácil manejo. Des de la web de OllyDbg se puede descargar las últimas versiones del software, aunque para poder acceder a todas sus funciones se requiere un registro con el autor (no sería necesario para las siguientes prácticas):

Descarga de OllyDbg

Una vez descargado el programa, se inicia el ejecutable (con permisos de administrador) y se carga y selecciona un fichero PE de 32 bits como se indica a continuación:

Cargar programa con OllyDbg

Una vez cargado el programa, se obtiene una interfaz formada por 4 partes. Estas cuatro partes se describirán a continuación, junto a algunas nociones para realizar debugging que se irán desarrollando y comprendiendo mejor a través de las prácticas:

Interfaz principal de OllyDbg

5.2.1.1. OllyDbg: Registros y FLAGS (banderas)

En la parte del registro, como el nombre indica, se hallan los registros. Estos son propios de cada arquitectura de CPU (procesadores), siendo las marcas principales Intel, ARM, etc. Los proveedores de estos componentes son los responsables de detallar que registros usarán sus productos de procesadores y con qué fines (suele ser similares…). La definición técnica de los registros es que son ubicaciones de memoria-almacenamiento que se encuentran en la CPU. En esta parte, se encuentran los valores en el momento de la ejecución del programa (si se pone el programa cargado en modo ejecución, estos valores irían cambiando). En esta sección también se hallan las FLAGS o banderas, que son bits (1 o 0) que determinan el resultado de una operación lógica y aritmética (y son bastante importantes para las prácticas a desarrollar):

Registros CPU en OllyDbg

Cada uno de estos registros tiene un propósito específico y se utilizan para realizar diferentes operaciones y mantener información durante la ejecución del programa. Los más importantes son los registros de propósito general (marcados en verde en la imagen) y su descripción sería la siguiente:

Registro

Nombre

Función principal

EAX

Acumulador

Operaciones de cálculo aritmético y almacenar resultados.

ECX

Contador

Contador de bucles en operaciones de control de flujo.

EDX

Datos

Almacenar datos que se van a procesar.

EBX

Base

Almacenar direcciones base o manipulación de datos generales.

ESP

Apuntador de Pila

Administrar la memoria de la pila (stack).

EBP

Apuntador Base

Acceder a argumentos y variables de funciones.

ESI

Índice Fuente

Operaciones de copia de memoria, actuando como índice fuente.

EDI

Índice Destino

Similar a ESI, pero como índice de destino de transferencia de datos.

EIP

Apuntador a la siguiente Función

Información de la siguiente instrucción que se ejecutará.

Como primer ejercicio, se puede comprobar iniciando el programa una vez capturado con el botón de Play superior, y ver donde apuntan las diferentes direcciones de memoria y como se van actualizando los registros durante la ejecución:

Programa en ejecución con OllyDbg

5.2.1.2. OllyDbg: Stack (Pila)

En los puntos anteriores se ha descrito la región de la pila (stack) como una parte fundamental de cualquier programa en ejecución. Como es un espacio de memoria creciente y decreciente, el Sistema Operativo le asigna determinados espacios de memoria virtual. La pila almacena datos temporales, direcciones de retorno de funciones y otros datos importantes durante la ejecución del programa. En esta sección de OllyDbg, se muestra las direcciones de memoria de la pila y los datos almacenados. Durante las prácticas, no es una sección que se vaya a utilizar de forma regular, pero conviene conocer su función:

Pila (Stack) en OllyDbg

5.2.1.3. OllyDbg: Dump (Volcado)

La sección del volcado de memoria contiene datos de almacenamiento de la memoria virtual durante la ejecución del programa. Se pueden encontrar los datos de la dirección, el volcado en hexadecimal y la representación en ASCII que es la forma más interpretable por un ser humano. Es normal que al cargar el ejecutable, la mayoría de estos datos se encuentren vacíos o con datos residuales

Volcado de memoria en OllyDbg

5.2.1.4. OllyDbg: Desensamblado

En la sección de desensamblado se ubica el código objeto de bajo nivel. En concreto están las siguientes columnas:

  • Direcciones de memoria: Cada dirección de memoria contiene una instrucción para el lenguaje ensamblador. Estas direcciones representan la parte de la memoria en la que se ha cargado el código. Estas direcciones variarán en función del equipo en el que se está usando OllyDbg. Son importantes para seguir el flujo de ejecución.
  • Código de operaciones en hexadecimal: Está la representación en sistema numérico hexadecimal de las instrucciones.
  • Instrucciones en lenguaje ensamblador: Son la representación codificada en mnemotécnicos y operandos de las instrucciones del programa que el ser humano es capaz de leer e interpretar.

Comentarios: Son notas adicionales. También se hallan comentarios que se hallan dentro del código, dejadas por el programador, y que pueden proporcionar información valiosa.

Llegar a tener un conocimiento absoluto del código ensamblador no es sencillo, y más teniendo en cuenta que este puede variar en función del tipo de procesador y arquitectura. A continuación se ofrecerá una breve descripción de algunos de los más importantes. Durante el desarrollo de las prácticas, se hará hincapié en aquellos que a la larga resultan más comunes al realizar operaciones de ingeniería inversa:

  • Instrucciones lógicas: Realizan operaciones fundamentales para manipular datos en el nivel de los bits.

AND, NEG, NOT, OR, TEST, XOR

  • Instrucciones aritméticas: Realización de operaciones esenciales para cálculos.

ADC, ADD (Sumar), DIV (Dividir), IDIV, MUL (Multiplicar), IMUL, SBB, SUB (Restar)

  • Instrucciones CALL y RET:

CALL

Es un proceso que contiene una función u otra CALL. Es decir, llamar a otra función.

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. Es decir, permite retornar desde una función a la llamada original (retorno).

  • Instrucciones de comparación: Se utiliza para comparar dos variables o registros, afectando a las banderas (FLAGS). Este comando es muy utilizando comparando un serial ingresado y el serial correcto, es muy usado en el cracking.

CMP VALOR_A, VALOR_B

  • Instrucciones de los saltos: Se utiliza para saltar hacia diferentes zonas en función de la validación de las FLAGS y del flujo de ejecución del programa.

JMP

Realiza un salto sin importar la condición de las banderas (FLAGS)

JE

Salta 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 utiliza mayormente para transferir un serial a un registro y luego proceder a comparar con la clave.

MOV VALOR_A, VALOR_B

  • Instrucciones de pila: Sirven para alojar datos y valores temporalmente en la pila y recuperarlo.

PUSH

Agrega el valor en la Pila

POP

Extrae el valor hacia el Registro

5.2.1.5. Alternativas a OllyDbg: IDA (Interactive Dissassembler) y GHIDRA

Para quien quiera seguir progresando en el ámbito de la ingeniería inversa, se recomienda, después de haber practicado con OllyDbg, emplear productos de desensamblador más modernos y que permiten explorar en 64 bits y otros tipos de formatos de fichero ejecutables, lenguajes de programación y varios tipos de procesadores. El software ideal sería IDA (Interactive Disassembler). Desde la web oficial, se puede descargar una versión gratuita:

https://hex-rays.com/ida-pro/

Para aprender de forma rápida sobre este desensamblador, se recomienda el siguiente curso creado por el usuario hdbreaker en GitHub:

https://github.com/hdbreaker/RicardoNarvaja_ExploitingWithIDAPRO_Desde0

Otra opción que también es recomendable y muy demandada en entornos profesionales es GHIDRA. Este software ha sido desarrollado por la NSA (Agencia Nacional de Seguridad de Estados Unidos). La web es la siguiente:

https://ghidra-sre.org/

5.2.1.6. Prácticas con OllyDbg: Cracking

A continuación se mostrará algunas prácticas de debugging con la herramienta OllyDbg para la depuración de código de un programa informático. En concreto, son tres prácticas en el ámbito del cracking. El cracking consiste en romper los sistemas de seguridad de un software para acceder a zonas no autorizadas y así obtener nuevas funcionalidades que no estaban disponibles en el producto inicial. Para evadir estos sistemas de seguridad es necesario emplear técnicas de ingeniería inversa.

Es habitual que al adquirir un determinado producto de software que consiste en un ejecutable, se requiera una clave especial que consiste en algún tipo de licencia, previo pago, y que una vez introducida permite acceder a partes del programa no disponibles en la versión inicial. No es necesario comentar que este tipo de actividades son ilegales y pueden constituir un delito. Para poder practicar el cracking, aparte de leer las secciones anteriores, existen páginas web que permiten descargar ejecutables en diferentes formatos y dificultades creados especialmente para practicar como por ejemplo CRACKMES.ONE.

Crackmes web