APRENDE EL ARTE DE LA INGENIERA INVERSA Manuel
























- Slides: 24
APRENDE EL ARTE DE LA INGENIERÍA INVERSA Manuel Rey Vilar
Agenda Objetivos del proyecto Lenguaje Ensamblador Arquitectura x 86 Introducción a la Ingeniería Inversa Marco legal OLLYDBG Caso práctico Bibliografía
Objetivos del Proyecto Comprender la estructura de un software, sus modos de funcionamiento y las características que impulsan su comportamiento.
Lenguaje Ensamblador • Se define como un lenguaje de programación que se usa para dar directamente órdenes al ordenador. • El ensamblador es el programa que convierte un fichero escrito en lenguaje ensamblador en código máquina o binario para que el ordenador pueda leerlo.
Ejemplo Un programa escrito en lenguaje ensamblador consiste en una serie de instrucciones que corresponden al flujo de órdenes ejecutables por un microprocesador. La sentencia: MOV AL, 61 h Asigna el valor hexadecimal 61 (97 decimal) al registro "AL". El programa ensamblador lee la sentencia de arriba y produce su equivalente binario en lenguaje de máquina. Binario: 101100001 (hexadecimal: B 61) El mnemónico MOV es un código de operación u “opcode". El opcode es seguido por una lista de argumentos o parámetros, completando una típica instrucción de ensamblador. En el ejemplo, AL es un registro de 8 bits del procesador, al cual se le asignará el valor hexadecimal 61 especificado.
El código de máquina generado por el ensamblador consiste de 2 bytes. El primer byte contiene empaquetado la instrucción MOV y el código del registro hacia donde se va a mover el dato: En el segundo byte se especifica el número 61 h, escrito en binario como 01100001, que se asignará al registro AL, quedando la sentencia ejecutable como: 101100001. La cual puede ser entendida y ejecutada directamente por el procesador.
Arquitectura x 86 Estructura von Neumann
Stack o Pila La pila es un lugar de la memoria donde se van guardando determinados valores para recuperarlos posteriormente.
Los Registros 32 bits 16 bits EAX AH AX AL Acumulador EBX BH BX BL Índice base ECX CH CX CL Contador EDX DH DX DL Datos ESP SP Apuntador de pila EBP BP Apuntador de base EDI DI Índice destino ESI SI Índice fuente EIP IP Apuntador de instrucci FLAGS Banderas CS Código DS Datos ES Extra SS Pila EFLAGS
Las Instrucciones Las instrucciones de la CPU pueden agruparse, de acuerdo a su funcionalidad, en: Operaciones con enteros: (Estas son operaciones realizadas por la Unidad Aritmético Lógica de la CPU) Ø Operaciones aritméticas. Como suma, resta, multiplicación, división, módulo, cambio de signo Ø Operaciones booleanas. Operaciones lógicas bit a bit como AND, OR, XOR, NOT Ø Operaciones de bits. Como desplazamiento y rotaciones de bits (hacia la derecha o hacia la izquierda, a través del bit del acarreo o sin él) Ø Comparaciones Operaciones de mover datos: Entre los registros y la memoria: Aunque la instrucción se llama "mover", en la CPU, "mover datos" significa en realidad copiar datos, desde un origen a un destino, sin que el dato desaparezca del origen. Se pueden mover valores: Ø desde un registro a otro Ø desde un registro a un lugar de la memoria Ø desde un lugar de la memoria a un registro Ø desde un lugar a otro de la memoria Ø un valor inmediato a un registro Ø un valor inmediato a un lugar de memoria
Operaciones de pila (stack): Ø PUSH (escribe datos hacia el tope de la pila) Ø POP (lee datos desde el tope de la pila) Operaciones de entrada/salida: Son operaciones que mueven datos de un registro, desde y hacia un puerto; o de la memoria, desde y hacia un puerto Ø INPUT Lectura desde un puerto de entrada Ø OUTPUT Escritura hacia un puerto de salida Operaciones para el control del flujo del programa: Ø Ø Llamadas y retornos de subrutinas Llamadas y retornos de interrupciones Saltos condicionales de acuerdo al resultado de la comparaciones Saltos incondicionales Operaciones con números reales: El estándar para las operaciones con números reales en las CPU está definido por el IEEE 754. Una CPU puede tener operaciones de punto flotante con números reales mediante el coprocesador numérico (si lo hay), como las siguientes: Ø Operaciones aritméticas. Suma, resta, multiplicación, división, cambio de signo, valor absoluto, parte entera Ø Operaciones trascendentales Operaciones trigonométricas. Seno, coseno, tangente, arcotangente Operaciones con logaritmos, potencias y raíces Ø Otras
Hello World
Introducción a la Ingeniería Inversa ¿Qué es la Ingeniería Inversa? La Ingeniería Inversa es un procedimiento mediante el cual se revierte el lenguaje de la máquina (lenguaje de bajo nivel) al código fuente de alto nivel en el que fue escrito originalmente un programa.
Aplicaciones de la Ingeniería Inversa Ø Estudiar virus y malware Ø Evaluar la calidad y robustez del software Ø Añadir funcionalidad al software existente Ø Posibilidad de interactuar con el código heredado sin conocer el código fuente Ø De forma fraudulenta crackeando software
Herramientas utilizadas en Ingeniería Inversa Desensamblador Traduce el lenguaje de máquina a lenguaje ensamblador. Depurador (Debugger) Prueba y depura (elimina) los errores del programa “objetivo” Editores Hexadecimales Permiten modificar archivos binarios
Herramientas utilizadas en Ingeniería Inversa Editores de recursos Permite visualizar, extraer, modificar, editar o reemplazar cualquier tipo de recursos contenidos en los ficheros ejecutables de una aplicación Herramientas de monitorización del sistema • Regshot • procmon Herramientas e Información misceláneos • Scripts • API
Marco Legal Uso legal de la Ingeniería Inversa Uso ilegal de la Ingeniería Inversa
Olly. DBG ¿Qué es Olly. DBG? Del autor Oleh Yuschuk, Olly. DBG es un depurador de código ensamblador de 32 bits para sistemas operativos Microsoft Windows. http: //www. ollydbg. de
Desensamblador
Los Registros
La Pila (Stack)
Dump
Caso práctico 1
Bibliografía Dennis Yurichev, Reverse Engineering for Beginners Eldad Eilam, Reversing: Secrets of Reverse Engineering ISBN: 978 -0 -7645 -7481 -8 624 pages April 2005 http: //opensecuritytraining. info/Introduction. To. Reverse. Engineering. html http: //www. openrce. org/articles/ http: //www. ollydbg. de/ http: //www. google. com/ https: //es. wikipedia. org