Está en la página 1de 7

Ingeniería Inversa como herramienta educativa en la Ciencia

de la Computación

Resumen: El concepto de ingeniería inversa es usado en muchos campos de la


Tecnología de la Información (IT), por nombrar algunos: compatibilidad heredada,
parcheo de código binario, análisis de malware, análisis de protocolo de red, etc. Pese a
su amplia utilidad, la ngeniería inversa no se enseña activamente en los cursos
relacionados a la Ciencia de la Computación. Este artículo científico trata de
proporcionar un estudio de algunos escenarios de uso del a vida real de la ingeniería
inversa; analiza qué habilidades y formas de pensar son desarrolladas y proporciona
ejemplos de cómo la ingeniería inversa podría ser enseñada mediante la solución
práctica de problemas. Nos centramos en la importancia del a ingeniería inversa como
herramienta para encender la automotivación de los estudiantes y construir
sistemáticamente sus capacidades de pensamiento lógico y habilidades analíticas.

1. INTRODUCCIÓN

Desde el inicio de los tiempos, la forma natural de pensar fue “realizar ingeniería
inversa” a la naturaleza; el fuego, las primeras herramientas, la manzana de
Newton, la fusión nuclear, todas ellas son solo ejemplos del entendimiento de un
proceso externo, no necesariamente de una profunda, pero lo suficiente para
nuestro propio propósito.

Durante miles de años, el hombre no entendía el proceso químico del fuego, y


seguimos sin saber si la gravitación tiene su propia partícula o no. Vemos a estos
procesos como cajas negras, describimos propiedades determinadas
experimentalmente y solo las usamos. Tal forma de pensar es llamada
descendente: Comienza de un sistema complejo e intenta descomponerlo en
pequeñas partes [1, 2, 3, 4]. De esta manera, la ingeniería inversa permite
enfocarse solo en los detalles importantes mediante la abstracción completa para
la tarea dada, sin detalles banales. Por ejemplo, usa el fuego sin preocuparse por
cómo funciona. Curiosamente todo el sistema educativo adopta el enfoque
opuesto: “Ingeniería de Vanguardia”: Se construye desde cero, capa tras capa
añadiendo complejidad, que también es llamada ascendente.
No aspiramos reemplazar el sistema actual, sólo queremos brindar un punto de
vista diferente que no se enseña normalmente y como mostraremos, puede ser
provechosa en varias situaciones donde se puedan resolver problemas
normalmente irresolubles o reducir en buena medida la complejidad de la
solución.
2. INGENIERÍA INVERSA (RE)

Los aspectos prácticos de la ingeniería inversa ya fueron estudiados


profundamente en la tesis Software de educación en ingeniería inversa por T.
Cipresso (Universidad Estatal de San José). Él dividió la RE en dos categorías:
Relacionado al Desarrollo de software y a la Seguridad, como se muestra en la
Figura 2 y 3.

También afirma que una de las motivaciones más fuertes del porqué se enseña
RE es el mantenimiento de software heredado y demuestra su punto de vista al
afirmar que cerca del 70% del código fuente en todo el mundo siguen escrita en
COBOL:
“Ya que es costoso rasgar y reemplazar billones de líneas de código heredado,
la única alternativa razonable ha sido mantener y desarrollar el código,
frecuentemente con la ayuda de conceptos encontrados en la ingeniería inversa
de Software”.

La Figura 1 ilustra el proceso de mantenimiento de sistemas de software


heredado.
Figura 1. El proceso de mantenimiento de sistemas de software heredado.

Figura 2. Escenarios de ingeniería inversa de Software relacionada al Desarrollo

Figura 3. Escenarios de ingeniería inversa relacionado a la Seguridad

Los escenarios de ingeniería inversa relacionados al Desarrollo incluyen:


 Lograr la interoperabilidad con el Software Propietario: Desarrollar
aplicaciones o controladores de dispositivos que interoperen (usen) con
las librerías de propietario en sistemas operativos o aplicaciones.
 Verificar la implementación de modo que coincida con el diseño:
Verificar que el código producido durante el avance del proceso de
desarrollo coincida con el diseño previsto, revirtiendo el código hasta un
diseño abstracto.
 Evaluar la calidad y robustez del software: Asegurar la calidad del
software antes de comprarlo, realizando un análisis heurístico de los
binarios para verificar ciertas secuencias de instrucciones que aparecen
en código de baja calidad.
 Reingeniería y evolución del mantenimiento de software heredado:
Recuperar el diseño de módulos de software heredado cuando la fuente
no está disponible para hacer posible el mantenimiento, evolución y
reutilización de los módulos.

Los escenarios de ingeniería inversa relacionados a la Seguridad incluyen:


 Detectar y neutralizar virus y malware: Detectar, analizar o
neutralizar (limpiar) virus, malwares, spywares y adwares.
 Testear algoritmos criptográficos para detectar debilidades: Testear
el nivel de seguridad de datos proporcionado por un algoritmo
criptográfico dado, analizándolo en busca de debilidades.
 Testear DRM (Gestión de Derechos Digitales) o Licencia de
Protección (Anti-Reversible): Realizar auditorías al programa en buscar
de vulnerabilidades de seguridad sin acceso al código fuente, mediante el
escaneo de las secuencias de instrucciones para detectar posibles
exploits.
3. INGENIERÍA INVERSA EN LA EDUCACIÓN

Algunas universidades ya intentaron integrar las técnicas de ingeniería inversa


con los cursos tradicionales de informática; un ejemplo es la Universidad de
Missouri-Rolla. Los resultados fueron muy alentadores, el 77% de los
estudiantes indicaron que la introducción de la metodología de la ingeniería
inversa reforzó los conceptos enseñados durante las clases. Además, el 82%
quería que se combinara en cursos futuros, especialmente en aquellos que se
encargaban del diseño.

Ambos enfoques mencionados (Universidad Estatal de San José y la


Universidad de Missouri-Rolla), están tratando de integrar la ingeniería inversa
en sus cursos al enfocarse solo en su uso práctico, sin tener en cuenta su valor
pedagógico más profundo que vamos a explorar en el siguiente texto.

La motivación viene en dos formas, intrínseca y extrínseca. Vamos a abordar la


motivación intrínseca, también llamada automotivación, que es la capacidad de
uno mismo para continuar en un camino incluso cuando se encuentran
obstáculos sin influencia de otras personas. Claramente, la automotivación es un
rasgo crítico de un ingeniero exitoso y es necesario poder resolver problemas de
forma independiente. Sostenemos que la automotivación es, en cierta medida, un
rasgo aprendido, aprendido por la experiencia. En efecto, no somos los primeros
en formular esta idea, como lo demuestra la cita célebre del almirante William
Halsey: “No hay grandes personas en este mundo. Sólo hay grandes retos que
las personas ordinarias enfrentamos para superar.”

Imagina ser forzado repetidamente a superar todas las expectativas. Supere sus
propios límites y haga lo que nunca pensó que fuera posible. Mediante la
exposición repetida de esta práctica, aumenta la confianza en uno mismo,
además del ego. El impulso del ego es naturalmente adictivo y, por lo tanto, una
forma de automotivación para superar desafíos. La ingeniería inversa es perfecta
para impulsar el ego, ya que los resultados se pueden obtener rápidamente y sin
un vasto conocimiento previo.

Para probar esta afirmación, podríamos ver por qué la ingeniería inversa es
popular entre ciertos ingenieros. Un ejemplo de un grupo que realiza ingeniería
inversa de software para divertirse es CORE, que por su traducción al español
significa: “Desafío de Ingeniería Inversa”. Otro ejemplo podrían ser los recientes
ataques de hacking de gran popularidad de LulzSec, que toman su nombre del
neologismo “Lulz”, (de LOLs), “reír a carcajadas” y “Sec”, que es la abreviatura
de “Seguridad”. Los mismos factores que motivan a estos ingenieros a asumir
los riesgos extremos de hacking/cracking, podrían y deberían ser usadas de
forma controlada para motivar a los estudiantes.

El enfoque de aprendizaje clásico de la ingeniería de vanguardia podría


compararse con la ingeniería inversa como aprendizaje para el éxito y
aprendizaje a través del éxito.

Esta lógica se puede demostrar simplemente con un ejemplo de ingeniería


inversa: Se proporciona un binario de la aplicación y se les pide a los estudiantes
que cambien el comportamiento de la aplicación sin acceso al código fuente, ni a
la documentación. La única técnica aplicada es el control del flujo de ejecución
utilizando un depurador. Se requiere conocimiento muy básico del lenguaje
ensamblador para que los estudiantes puedan monitorear y controlar la cadena
de ejecución. Ellos necesitan explorar el comportamiento de la aplicación, usar
habilidades analíticas para identificar en qué parte es importante enfocarse,
encontrar el código correspondiente y rastrear el flujo de ejecución hasta que se
den cuenta de las instrucciones exactas que definen el comportamiento de la
aplicación que se les ha pedido que modifiquen. Usando un enfoque
experimental sistemático, modifican el conjunto localizado de instrucciones y
monitorean el comportamiento resultante hasta que se logra el objetivo dado.
Los estudiantes acaban de crear su primer parche binario, o se podría decir, su
primer “crack” de software. Suponemos que la gran mayoría de estudiantes,
aunque entraron en contacto con “cracks” de software, nunca pensaron que
serían capaces de crear una en la primera lección del curso.

El mismo escenario puede variar según el nivel de conocimiento previo del


lenguaje ensamblador, por ejemplo, el flujo de ejecución podría desviarse al
comprender las comparaciones lógicas y cambiar las instrucciones “cmp”, en
consecuencia. O un “generador de claves”, podría ser diseñado con ingeniería
inversa, basando en la comprensión del proceso de verificación de claves.

El tema de la ingeniería inversa no se limita a la disección de binarios de


aplicaciones, los protocolos de red también son un objetivo interesante.
Podríamos verlos como entrada/salida de una aplicación y al entenderlos,
comprender la aplicación. Los protocolos criptográficos más conocidos son
Seguridad de la Capa de Transporte (TLS) y Capa de Conexión Segura (SSL),
que proporcionan seguridad de comunicación a través de Internet. Se utilizan en
aplicaciones como navegación web, correo electrónico, fax por internet,
mensajería instantánea y voz sobre IP (VoIP). Se podría pedir a los estudiantes
que realicen ingeniería inversa de un protocolo protegido por SSL utilizando un
proxy de red; que analicen y simulen un “ataque de intermediario” o que un
cliente pueda usar un servicio proporcionado por la red sin el software original.
Una vez más, se requeriría un pensamiento analítico para gestionar la
“complejidad” del protocolo, enfocarse en una capa de complejidad a la vez y
avanzar a través de esta. Con un conocimiento previo limitado, los estudiantes
lograrían hackear un protocolo protegido con el mismo mecanismo que protege
la mayor parte de Internet en una sola lección. Por supuesto, el objetivo es
simplemente abrir las puertas a los estudiantes para que se den cuenta de que
pueden lograr más de lo que pensaban. De forma adicional, la explotación del
protocolo podría darse como tarea; el estudiante más creativo podría ser
recompensado.

Como ya se mencionó, el enfoque descendente empleado por la ingeniería


inversa es extremadamente valioso, por ejemplo, para la creación rápida de
prototipos. Digamos que a los estudiantes se les da la tarea de crear prototipos de
un sistema demasiado complejo para desarrollar desde cero, además se les da un
tiempo muy limitado para cumplir con la tarea. La única manera de cómo ellos
podrían gestionarlo sería mediante la búsqueda de soluciones existentes, como
bibliotecas o aplicaciones completas, que podrían combinar para crear un
sistema con la funcionalidad deseada. Para aclarar el punto educativo, no
necesitarían hacer que se ejecute realmente, sino solo que entiendan el API o las
partes funcionales y ser capaces de combinarlas mediante seudocódigo. La
solución más simple y elegante debe ser recompensada. De esta manera, los
estudiantes se darían cuenta de que es posible lograr mucho más de lo que
pensaban en periodo de tiempo limitado, diseccionando un sistema complejo en
pequeñas partes y reutilizando soluciones existentes.

4. CONCLUSIONES

Si definimos el hacking como el arte de la resolución creativa de problemas, la


ingeniería inversa sería el arte de la disección de problemas y, por lo tanto, una
parte crítica de cualquier proceso de resolución de problemas eficiente. En este
artículo presentamos ideas sobre cómo la ingeniería inversa puede usarse para
encender la automotivación de los estudiantes, desarrollar sistemáticamente sus
capacidades de pensamiento lógico y habilidades analíticas. Con el crecimiento
exponencial de la cantidad de información necesaria para resolver problemas
relacionados con IT o competir en el mercado laboral global, es crucial
comprender que sólo hay dos opciones hacia las que se puede dirigir el sistema
educativo. Ya sea intentar competir con países ricos en población como India o
China utilizando el enfoque tradicional ascendente, que se centra en las
habilidades y la información que siguen cambiando a un ritmo creciente o ya sea
tratar de incrementar el sistema educativo con técnicas de ingeniería inversa para
centrarse en enseñar a pensar creativamente en su lugar. También sostenemos
que con la forma correcta de pensar y con un enfoque sistemático, todos los
problemas tienen solución. La ingeniería inversa es el arte que enseña estas
habilidades. Debido a su importancia, esperamos sinceramente que la ingeniería
inversa se integre en la educación informática, ya sea como un curso
independiente o como parte de los ya existentes.

También podría gustarte