Laboratorio de ingeniería inversa: leer programas con gdb, radare2, strace y ltrace en una VM
Este laboratorio enseña a leer un programa que no tiene código fuente. Cada alumno recibe una VM Ubuntu con un compilador, el depurador gdb, el desensamblador radare2, binutils, strace y ltrace, y cinco programas pequeños escritos para el laboratorio, cada uno de los cuales esconde una clave. Los alumnos encuentran las claves mirando los programas, como lo haría quien defiende un sistema o quien estudia compiladores, y las escriben en un archivo.
Es solo leer y comprender, con programas que el propio laboratorio compiló. No se instala nada en el ordenador del alumno, y nada de esto enseña software malicioso, saltarse la licencia de programas reales, generadores de claves para ellos, esconder un programa de un depurador, exploits, ni mirar ningún programa que no sea el del laboratorio.
Qué aprenden los alumnos
Una escalera de cinco programas, cada uno leído con una herramienta distinta. El primero guarda su contraseña a la vista, y strings y objdump o radare2 la muestran sin ejecutarlo. El segundo construye su contraseña mientras se ejecuta, así que los alumnos lo detienen en gdb en la comparación de cadenas y leen la respuesta de la memoria. El tercero pide un número y lo comprueba con unos pasos de aritmética, que los alumnos leen en el desensamblado y deshacen hacia atrás. El cuarto une las dos mitades de una clave, que ltrace muestra en una llamada a biblioteca. El quinto busca un archivo cuyo nombre contiene la clave, que strace muestra en una llamada al sistema.
Detrás está la lección que necesita quien defiende un sistema: todo lo que un programa necesita saber para funcionar, un lector puede encontrarlo, así que un secreto guardado en un programa no es un secreto.
Claves distintas en cada copia
El repositorio del laboratorio es público, así que no hay ninguna clave en él. Cuando arranca por primera vez la VM de un alumno, el script crea claves aleatorias nuevas, las guarda en una carpeta en la que solo entra el administrador, construye los programas con ellas y borra los fuentes. El script nunca imprime una clave. Las respuestas de un alumno se comparan con las claves de su propia copia, así que las respuestas de un compañero, el README y los archivos del laboratorio no revelan nada. Un alumno que use sudo en su propia máquina podría leer las claves guardadas: el laboratorio confía en el alumno con su propia máquina, y las claves sirven para aprender, no para guardar un secreto frente a quien es dueño de la VM.
Ejecútalo en tu navegador
Los laboratorios VM se ponen como tarea de laboratorio en un módulo, y el ejemplo está en la página del laboratorio. La máquina es pequeña: una CPU, 1 GB de memoria y 10 GB de disco. Las herramientas juntas usan mucho menos de una décima parte de esa memoria.
- Añade el laboratorio. En un módulo que enseñes, añade una tarea y elige la tarjeta de laboratorio VM de Ubuntu. La página muestra una breve descripción de la máquina en lugar de un archivo compose.
- Empieza desde el ejemplo. La página ofrece laboratorios listos para empezar. Elige Ingeniería inversa. Usar un ejemplo sustituye el texto, y Deshacer recupera el tuyo.
- Publica e inicia tu propia copia. Publica y luego Inicia. El script de instalación del laboratorio instala el compilador, gdb, radare2, strace y ltrace desde el archivo de Ubuntu, crea claves aleatorias nuevas, construye los programas con ellas y escribe el README, la primera vez que arranca la VM, en unos minutos.
- Abre el terminal. Abre su terminal y lee README.md en la carpeta personal: dice qué hacer y no da ninguna respuesta.
Una lección básica en este laboratorio
Reverse Engineering Basics es una lección pequeña que se trabaja en este laboratorio, una VM Ubuntu. Tiene un gancho, un objetivo Puedo, la regla que hay que recordar, palabras clave, un calentamiento, una comprobación tras cada idea, un error frecuente y una comprobación final, y cada paso tiene un botón Ejecutar que escribe su comando en el terminal de la máquina. El alumno observa un programa inofensivo con file, strings, objdump, radare2, gdb, ltrace y strace.
La lección da una vuelta por las herramientas y deja al alumno los cinco programas con clave, que son la tarea del laboratorio, así que no da ninguna respuesta.
Cómo se califica
El laboratorio tiene una comprobación. Se ejecuta sobre una copia de la máquina guardada tras un arranque limpio y lee el archivo answers.txt de la carpeta personal del alumno. Cada una de las cinco claves debe ser la clave creada para la copia de ese alumno y para ese programa, así que una suposición, una línea vacía, la clave de otra copia o una clave puesta junto al programa equivocado no pasa. La comprobación también prueba cada programa con su propia clave, de modo que se nota un programa modificado. La primera línea de lo que imprimió la comprobación dice qué programa está mal.
- Repártelo. Asigna el laboratorio como cualquier tarea, con fecha de entrega si quieres. Cada alumno recibe una VM propia, conservada entre sesiones, con claves propias.
- Ejecuta la comprobación. En la fila de un alumno de la lista de la clase, pulsa Ejecutar la comprobación. Arranca una copia de su máquina guardada que no se guarda de vuelta, ejecuta como root el script de comprobación del laboratorio y muestra si pasó, qué imprimió y cuándo. Al alumno no se le dice el resultado.
- Califícalo. Lee la primera línea de lo que imprimió la comprobación: nombra el primer programa cuya clave falta o no es la de esa copia. Devuelve el trabajo con un motivo si necesita más.
La definición en GitHub
El archivo es toda la definición del laboratorio, el mismo texto que ejecuta la plataforma: tamaño, script de instalación, fuentes de los cinco programas, README y comprobación. Cópialo y cambia los programas o las claves para hacer un laboratorio más largo.
Prueba este laboratorio, y lo que cuesta
Con una cuenta personal gratuita puedes seguir las lecciones básicas de este laboratorio, con crédito gratuito suficiente cada mes para seguir la mayoría de las lecciones y sin tarjeta. Para una clase, un centro tiene gratis sus primeros 365 días, hasta 50 alumnos, y después paga por alumno y año, con todos los laboratorios incluidos y el profesorado gratis.
Preguntas frecuentes
- ¿Necesita el laboratorio una licencia o un programa especial?
- No. El compilador, gdb, radare2, binutils, strace y ltrace son de código abierto y vienen del archivo de Ubuntu cuando arranca la VM del alumno. Nosotros no distribuimos nada de eso.
- ¿Esto enseña a entrar en programas ajenos?
- No. Los programas son juguetes del propio laboratorio y cada uno se lee para entender cómo funciona un programa, que es lo que necesitan quien defiende un sistema, quien desarrolla sin tener los fuentes y quien estudia compiladores. El laboratorio nunca enseña software malicioso, saltarse la licencia de programas reales, generadores de claves, esconder un programa de un depurador, exploits, ni mirar ningún programa que no sea el suyo, y la copia de un alumno no puede salir a internet a buscar uno.
- ¿Pueden los alumnos romper algo?
- Solo su propia copia. Los programas se ejecutan con los permisos del alumno y la VM llega al archivo de Ubuntu y a nada más en el plan gratuito. Leer los programas no puede estropearlos.
- ¿Se probó el laboratorio en una VM real de alumno?
- La instalación, los comandos de la lección, la comprobación y cada forma de engañarla se ejecutaron en un contenedor real de Ubuntu 26.04, y cada una de las cinco claves se encontró con la herramienta prevista, como un usuario sin derechos de administrador. Una VM de alumno realmente arrancada, con el kernel de la máquina, merece una prueba antes de una clase.