5.1.1. Software: características, ingeniería inversa y vulnerabilidades
Este bloque pretende dar a conocer una serie de técnicas y nociones relacionadas con el software y las vulnerabilidades asociadas a este. Estas vulnerabilidades pueden ser explotadas de diferentes formas, permitiendo por ejemplo obtener un acceso no autorizado a una serie de funciones (cracking), desarrollar un exploit con técnicas de fuzzing u ocultar un código malicioso en un fichero ejecutable de software (FUD: Fully Undetectable Malware). Todas estas nociones se desarrollaran de forma práctica en los siguientes puntos.
La aplicación correcta de estas técnicas de análisis de software, requiere conocimientos avanzados en ingeniería de software y otras tantas materias que permiten aplicar ingeniería inversa de software. Mientras que la ingeniería de software abarca el proceso creativo y técnico que permite obtener un producto informático determinado por sus funcionalidades, usos y ciclo de vida (una aplicación particular, un sistema operativo, una base de datos, un servicio de red, etc.), la ingeniería inversa de software es el proceso inverso a través del cual se obtiene información sobre el funcionamiento interno del software en todos sus aspectos: cómo interactúan sus procesos en ejecución con la memoria principal y el sistema operativo, que variables y parámetros lo definen y cómo se comporta ante determinados inputs. Obtener esta valiosa información, abre las puertas a la explotación de vulnerabilidades.
Este bloque es totalmente introductorio y basado en una serie de prácticas para comprender de forma elemental nociones y técnicas. El dominio absoluto de las materias que se exponen requiere una gran profundización, que en muchos casos van más allá de la obtención de un grado de ingeniería de informática o software. No obstante, se ha hecho un esfuerzo para que desde un enfoque práctico un usuario principiante pueda entender lo más básico, incluso sin tener conocimientos de programación (de hecho, no es el aspecto más importante). A pesar de esto, sí se recomienda haber seguido y comprendido algunos puntos de los bloques anteriores, pues la aplicación de técnicas de ingeniería inversa requiere la aplicación conjunta de varios conocimientos que se han ido presentando de forma introductoria:
- Estructura de datos de los protocolos se la suit IP/TCP
- Análisis de paquetes de información: Wireshark
- Introducción a explotación de servidores y hosts
- Metasploit payloads: MSFvenom
- Sistemas operativos: CPU y procesos
- Sistemas operativos: Gestión de la memoria
- Otros: Compilación de software; Tipos de redes; Estructura y distribución de software; Software para redes.
Para estos temas, existe bibliografía muy especializada a la que no siempre es fácil acceder y suelen ser manuales técnicos de difícil lectura (y en inglés). Si se busca una lectura de nivel intermedio en español y ampliar conocimientos que en este bloque se pasa de forma rápida por ellos, se recomienda este libro y/o web por ejemplo:
Garrote G., Rubén. Reversing. Ingeniería Inversa. Teoría y aplicación. Editorial Ra-Ma. Junio 2017. Madrid (España)
https://www.ra-ma.es/libro/reversing-ingenieria-inversa_83254
Conceptos básicos debugging
https://www.w0lff4ng.org/conceptos-basicos-de-assembler-y-debugger/
La exposición de estos temas se basará en la aplicación de técnicas de ingeniería inversa sobre ficheros ejecutables, principalmente en el formato PE (Portable Executable). Estos se corresponden a los ficheros con extensión .exe que se suele utilizar en el entorno del Sistema Operativo Windows, y que sirven para iniciar un programa o una aplicación (y con ello uno o varios procesos en ejecución en la memoria). Otra herramienta fundamental será OllyDbg. OllyDbg pertenece a la familia de software depurador de código y/o desensambladores. Este tipo de programas permiten que, sin poder acceder al código fuente original del programa, de realicen una serie de operaciones que traducen el contenido en binario del fichero en lenguaje objeto más comprensible para los humanos, y a su vez controlar el flujo de ejecución en detalle (ver siguientes páginas para el detalle de estos conceptos).