Ingeniería inversa: qué es, herramientas y técnicas

5 octubre, 2021
Foto: Christina Morillo en Pexels.

En este artículo de Jordi Serra, profesor de los Estudios de Informática, Multimedia y Telecomunicación e investigador del grupo KISON del Internet Interdisciplinary Institute (IN3) de la UOC, vamos a aprender en qué consiste la ingeniería inversa o Reverse Engineering y cuáles son las técnicas y herramientas más utilizadas en este ámbito.

La ingeniería inversa es el proceso llevado a cabo con el objetivo de obtener información o un diseño a partir de un producto u objeto, con el fin de determinar cuáles son sus componentes y de qué manera interactúan entre sí y cuál fue el proceso de fabricación. Esta técnica puede servir, por ejemplo, para entender cómo funciona internamente un objeto o para mejorarlo. Se trata de una práctica ya realizada por las industrias más antiguas para copiar y mejorar los artefactos antiguos. Más recientemente, este concepto también se ha aplicado, y se está aplicando con frecuencia, en hardware y software de aplicaciones informáticas en toda su gama de plataformas.

Podríamos decir que es como ir limando un chip con máquinas especiales que van dejando al descubierto cada una de las capas de componentes y así ver cómo está construido, cuál es la circuitería y los componentes que tiene. En la segunda guerra mundial se intentó con la máquina enigma, aunque sin los códigos de poco sirvió. A través de la ingeniería inversa también podemos ver cómo está hecho un programa informático a partir del código ya compilado y por tanto sin acceso al código fuente.

Existe una rama de la ciberseguridad que se dedica a la ingeniería inversa para ver cómo se ha realizado un determinado programa. En este ámbito, destacan dos vertientes: la de quiénes se dedican a cambiar el comportamiento de un programa para saltarse algún tipo de protección de instalación o verificación o para copiar ese software para sacar un provecho de algo ajeno; y la de aquellos que intentan descubrir cómo se ha creado un malware para poder detectarlo con anterioridad. ¿La diferencia entre ambas?  Los primeros quieren obtener un beneficio y los segundos generar conocimiento y aportar a la comunidad. No obstante, los dos perfiles utilizarán las mismas herramientas que ahora veremos.

Lo primero que hemos de tener muy claro es que para poder jugar con la ingeniería inversa hay que entender completamente el lenguaje de programación ensamblador, ya que las herramientas de reversing pasan de código máquina ejecutable a código ensamblador. Se trata de un pequeño código que compara dos valores, realizado en lenguaje de programación C, que en ensamblador son unas cuantas líneas de código más. Veamos un ejemplo:

El siguiente código en lenguaje de programación C:

En lenguaje de programación ensamblador quedaría así:

Podemos ver que es un poco más complejo de seguir, aunque con un buen conocimiento del lenguaje ensamblador es relativamente fácil.

Las herramientas que podemos utilizar para realizar esta parte de ingeniería inversa las encontraremos casi todas instaladas en la distribución Kali Linux. Son varias, pero hay algunas que sobresalen por sus características: los desensambladores y los debugadores.

Los desensambladores nos dan el código fuente a partir del fichero ejecutable o DLL como, por ejemplo:

  • Un debugador con opción de desensamblador.
  • Radare, y Radare2, con ensamblador y desensamblador con análisis de código.

Por otro lado, los debugadores nos muestran paso a paso la ejecución del programa que se está estudiando y nos dan la posibilidad de interactuar con los valores de los registros para cambiar el comportamiento de éste en tiempo real. Es decir, nos permiten parar la ejecución del programa en un punto concreto y cambiar los valores de los registros para cambiar así la salida programada. En este caso podemos utilizar:

  • DBG.
  • OllyDbg.

Si nos centramos en OllyDbg, éste nos ofrece una ventana en la que podemos ver todos los componentes del programa, código, datos, instrucciones, registros y memoria:

Aquí podemos poner breakpoints y parar la ejecución de una línea concreta del código para ver qué es lo que está realizando, qué datos tiene en la memoria o en los registros, obtener direcciones de memoria sobre dónde están estos valores o las direcciones de las funciones. Simplemente paramos el código en la parte que queremos y en la ventana de los valores de los registros podemos cambiar el valor numérico de cualquiera. Otra cosa es que tenga sentido el cambio para las siguientes instrucciones, pero dependiendo de cómo se realiza la modificación seríamos capaces de cambiar el comportamiento de un programa. Imaginemos que podemos cambiar la dirección de una función que sabemos que se llama posteriormente por otro valor dónde hay una función propia que realiza otra acción en el PC. Si se puede cambiar y generar ejecutables (un desensamblador…) podremos generar programas que se salten una parte o que se ejecuten sin percibir un código malicioso.

Los analistas de malware usan también estos debuggers, después de aplicar las técnicas y herramientas de ofuscación de código, para detectar como se difunde o se controla desde el C&C remoto. El malware en la actualidad ya viene ofuscado para dificultar esta parte de reversing, cambiando constantemente las variables, insertando diferentes codificaciones de caracteres, o insertando comentarios en medio de las propias líneas de código. Los debugadores permiten a los analistas de malware crear, por ejemplo, herramientas que permitan descifrar los ficheros cifrados por un ransomware. Si en el análisis de código encuentran los códigos de cifrado, o las comunicaciones hacia el C&C de donde las obtienen, podrán crear alguna herramienta que realice lo contrario y así tener la posibilidad de recuperar los datos. Esto demuestra que no todo en el mundo de la ingeniería inversa es malicioso, si no que esta práctica también puede tener finalidades positivas.

Autor / Autora
Doctor en Ingeniería Informática por la UOC y profesor en la misma universidad. Además, es especialista en Ciberseguridad y hacking ético.
Comentarios
Deja un comentario