Introducción a la Ingeniería Inversa Francisco Blas Izquierdo Riera (klondike).
¿Qué es la ingeniería inversa? La ingeniería inversa consiste en el análisis de un sistema procediendo a su desmontaje para poder acceder a sus componentes básicos. Por ejemplo, ver como funciona un teléfono desmontándolo y viendo donde actua cada voltaje o ver como funciona un binario desensamblandolo y viendo que hace cada instrucción.
¿Es legal la ingeniería inversa? ● Generalmente si se tiene permiso del autor/fabricante del sistema sí. ● Además en Europa es legal con fines de interoperabilidad. (Por ejemplo ver como funciona el filtro de Microsoft Word). ● En EE.UU. El aspecto legal es más turbio, especialmente por la DMCA, pero suele verse como una forma de potenciar la innovación.
¿Se puede hacer Ingeniería Inversa sobre hardware? Sí, pero es un proceso algo lento y costoso. Un pequeño ejemplo lo podéis encontrar en El proceso consiste en realizar un análisis de caja negra viendo como responden las salidas frente a la entrada, aunque también se pueden poner sensores en distintos puntos intermedios.
¿Se puede hacer Ingeniería Inversa sobre microchips? Sí, pero es particularmente complejo y se requiere de muy buen equipo. Además muchos microchips, especialmente los relacionados con aspectos de seguridad, suelen ser resistentes a la apertura destruyendose en caso de abrirse.
¿Se puede hacer Ingeniería Inversa sobre Software? Sí, y es sencilla una vez que se entiende como funciona un programa (genérico).
Un poco de teoría sobre software ● Un algoritmo es una secuencia de instrucciones que dada una entrada devuelve una salida. ● Todo programa es un algoritmo con datos. ● Todo algoritmo puede representarse a su vez con un tipo de datos especial que codifican sus instrucciones.
Un poco de teoría sobre software ● Se entienden por datos estáticos aquellos que son iguales al iniciar cada ejecución del algoritmo. ● Se entienden por datos dinámicos aquellos que proceden del exterior (ficheros, usuario...). ● Un ejecutable es un conjunto de datos que embebe un algoritmo y unos datos estáticos.
Un poco de teoría sobre software ● Si queremos modificar la salida tenemos tres alternativas: ● Modificar los datos estáticos. I.e. la semilla de un reconocedor. ● Modificar los datos dinámicos. I.e. introducir una entrada adecuada. ● Modificar el algoritmo. I.e. hacer que devuelva el valor deseado.
Una pequeña abstracción Por lo general, un programa puede considerarse un conjunto de operaciones aritméticas ejecutadas sobre la memoria a las que se accede mediante una serie de saltos (condicionales o no). Luego si queremos modificar un algoritmo para obtener una salida basta con forzarle a ejecutar una serie de saltos adecuada y si queremos analizarlo, basta con observar que operaciones aritméticas hace y que saltos toma según la entrada.
Abstrayendo un reconocedor de claves La forma más sencilla de ver un reconocedor de claves es hacerlo como un reconocedor de gramáticas que devuelve SÍ si es correcta y NO si no lo es. Dado un reconocedor desconocido, la única forma de conocer que palabras pertenecen a la gramática es generando todas las palabras posibles e introduciéndoselas al reconocedor para ver que indica. Este método es conocido como búsqueda por fuerza bruta, es de tipo np. y tiene coste exponencial.
¿Qué protecciones vamos a explicar? ● Comprobación de contraseña básica ● Comprobación de clave mediante aritmética ● Comprobación mediante criptografía de clave pública ● Comprobación mediante dispositivo físico ● Comprobación mediante servidor remoto ● Comprobación mediante servidor remoto con ejecución parcial en el mismo
¿Qué ataques se explicarán? ● Detección de cadenas en los datos (strings). ● Desensamblado de un programa usando un desensamblador (hte). ● Editación el algoritmo de un programa o sus datos fijos, usando un editor adecuado (hte). ● Análisis del proceso de ejecución de un programa, analizanado y modificando sus datos, usando un debugger (gdb). ● Análisis del flujo de red.
Protección: Comprobación de contraseña básica ● Ventajas: ● Es muy simple, básicamente se comprueba si la contraseña coincide con una almacenada en el ejecutable. ● Desventajas: ● Es vulnerable a cracking y es trivial hacer un keygen para el mismo. ● Si se divulga la clave deja de ser útil.
Ataque: Detección de cadenas en un programa ● Es una forma rápida y sencilla de detectar partes de gramáticas, y en ocasiones palabras completas de la misma. ● Se basa en que toda cadena ASCII cumple una serie de propiedades (códigos entre 20 y 127 por ejemplo). Por lo que extrae aquellas partes del fichero que las cumplen. ● Analizar las cadenas a veces puede ser tedioso y puede favorecer el error. ● Basta con ejecutar: ”$strings programa | less”.
DEMO
Protección: Comprobación de clave mediante aritmética ● Ventajas: ● No muy complejo, comprueba que los distintos trozos de la clave cumplan algunas propiedades. ● Desventajas: ● Es vulnerable a cracking y suele ser factible hacer un keygen. ● Si se divulga una clave válida esta puede reutilizarse.
Ataque: Desensamblado de un programa ● Permite conocer el algoritmo subyacente a un programa y, a veces, ver cuales son sus datos. ● Requiere de ciertos conocimientos técnicos (mayormente programación y entender lenguaje ensamblador). ● Es bastante más costoso y puede inducir ocasionalmente a errores.
Ataque: Desensamblado de un programa ● Basta con abrir el fichero con el hte ”$ht prog” ● Pulsamos la tecla F6 y elegimos el modo adecuado
DEMO
Protección: Comprobación mediante criptografía de clave pública ● Ventajas: ● Si la función de hash y el algoritmo de firma son seguros es teóricamente imposible generar un keygen mejor que la fuerza bruta. ● Desventajas: ● Bastante más complejo de implementar. ● Es vulnerable a cracking (aunque sea cambiando la clave pública almacenada). ● Si se divulga una clave válida esta puede reutilizarse.
Protección: Comprobación mediante criptografía de clave pública ● Ventajas: ● Si la función de hash y el algoritmo de firma son seguros es teóricamente imposible generar un keygen mejor que la fuerza bruta. ● Desventajas: ● Bastante más complejo de implementar. ● Es vulnerable a cracking (aunque sea cambiando la clave pública almacenada). ● Si se divulga una clave válida esta puede reutilizarse.
Ataque: Editado de un programa ● Permite modificar el algoritmo y los datos estáticos. ● Suele ser el procedimiento habitual a la hora de crear un crack. ● Requiere un poco más de experiencia que el desensamblado.
Ataque: Editado de un programa ● Abrimos el fichero con el hte ”$ht prog” ● Pulsamos la tecla F6 y elegimos el modo adecuado ● Pulsando F4 entramos en el modo de edición donde podemos cambiar el valor hexadecimal del dato o la instrucción.
DEMO
Protección: Comprobación mediante dispositivo físico ● Ventajas: ● No se puede reutilizar el mismo dispositivo. ● Desventajas: ● Bastante más complejo de implementar. ● Es vulnerable a cracking. ● Requiere de envío del dispositivo. ● Muchas veces puede emularse su comportamiento mediante software.
Ataque: Sniffing de puertos ● Permite ver el tráfico entre el equipo y un dispositivo. ● Se usan programas como el usbmon.
Protección: Comprobación de clave mediante servidor remoto ● Ventajas: ● Impide la ejecución de varias instancias con la misma clave. ● Puede combinarse con criptografía para evitar que se cree un keygen. ● Desventajas: ● Bastante más complejo de implementar. ● Es vulnerable a cracking. ● Depende de una máquina remota que debe estar siempre en marcha. ● Si el protocolo no está bien diseñado puede ser sencillo crear un servidor que autentifique siempre.
Ataque: Analisis del tráfico de red. ● Permite comprobar el flujo de datos entre el programa y la máquina remota. ● Uniendo esto con las técnicas anteriores puede ser posible reescribir partes ejecutadas de forma remota. ● Esta técnica puede obviarse usando por ejemplo un debugger, pero es más fácil así ya que es más sencillo ver los datos que se envían.. ● Basta con ejecutar el wireshark y ponerlo a escuchar.
Protección: Comprobación mediante servidor remoto con ejecución parcial en el mismo ● Ventajas: ● Impide la ejecución de varias instancias con la misma clave. ● Puede combinarse con criptografía para evitar que se cree un keygen. ● Desventajas: ● Bastante más complejo de implementar. ● Es vulnerable a cracking (si se logra emular el comportamiento del servidor). ● Depende de una máquina remota que debe estar siempre en marcha.
Ataque: Analisis y modificación de datos durante la ejecución. ● Permite comprobar la ruta seguida por un algoritmo y las modificaciones que este hace. ● Suele ser el procedimiento habitual a la hora de crear un keygen o de analizar un programa. ● Requiere conocimientos de ensamblador. ● Basta con ejecutar el programa con el gdb y poner puntos de ruptura donde queramos estudiar el código.
DEMO
Gracias por atender Contacto: klondike ( e n ) xiscosoft.es Material: Webs de interés: