¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Ver llamadas con ltrace y strace

Después de esta lección: Puedo leer una traza y decir qué texto compara un programa y qué archivo busca.

Lección de 55 min10 comandosLaboratorio de ingeniería inversa: leer programas con gdb, radare2, strace y ltrace en una VM

Qué muestran ltrace y strace

ltrace y strace muestran qué pide un programa mientras corre: ltrace, las llamadas a la biblioteca, y strace, las llamadas al sistema operativo. Con ellos ves qué texto compara un programa o qué archivo busca, sin leer una línea de ensamblador.

Un programa de caja de una tienda busca un archivo de licencia que no existe. Una traza dice cuál.

Al final de esta lección

Nota

Puedo leer una traza y decir qué texto compara un programa y qué archivo busca.

Palabras clave

PalabraQué significaEjemplo
Llamada a bibliotecauna llamada a código ya hecho, como strcmp o putsltrace
Llamada al sistemauna petición del programa al sistema operativo, como abrir un archivostrace
Trazala lista, en orden, de las llamadas que hace un programa
Rutael nombre completo de un archivo, con sus carpetas/tmp/.tienda-licencia
ENOENTel error que dice que el archivo pedido no existe

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

ltrace lista las llamadas a la biblioteca

ltrace programa ejecuta el programa y escribe cada llamada que hace a una biblioteca, con sus argumentos. Una llamada a strcmp enseña los dos textos que compara.

Recuerda la regla: solo programas del laboratorio. El primer Run crea tienda, un programa de ejemplo nuestro. Los otros filtran la salida con grep -o para dejar solo la llamada que interesa.

Crea el programa de ejemplo tienda

Comando
printf '#include <stdio.h>\n#include <string.h>\nint main(int argc, char **argv) {\n    if (argc == 2 && strcmp(argv[1], "REBAJAS26") == 0) { puts("Descuento aplicado"); return 0; }\n    puts("Codigo incorrecto");\n    return 1;\n}\n' | gcc -O0 -no-pie -x c -o /tmp/tienda -

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Mira los dos textos de strcmp

Comando
ltrace /tmp/tienda hola 2>&1 | grep -o 'strcmp("[^"]*", "[^"]*")'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Mira el texto que imprime puts

Comando
ltrace /tmp/tienda hola 2>&1 | grep -o 'puts("[^"]*")'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

strace lista las llamadas al sistema

strace programa escribe cada petición que el programa hace al sistema operativo: abrir un archivo, leer, escribir. -e trace=openat deja solo las aperturas de archivos.

Si el archivo no existe, la apertura devuelve -1 y el error ENOENT. El segundo programa de ejemplo, licencia, busca un archivo de licencia en /tmp.

Crea el programa de ejemplo licencia

Comando
printf '#include <stdio.h>\nint main(void) {\n    FILE *f = fopen("/tmp/.tienda-licencia", "r");\n    if (f) { fclose(f); puts("Licencia encontrada"); return 0; }\n    puts("Falta la licencia");\n    return 1;\n}\n' | gcc -O0 -no-pie -x c -o /tmp/licencia -

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejecútalo y lee lo que dice

Comando
/tmp/licencia

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Mira qué archivo abre y no encuentra

Comando
strace -e trace=openat /tmp/licencia 2>&1 | grep tienda

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Mira lo mismo en la biblioteca

Comando
ltrace /tmp/licencia 2>&1 | grep -o 'fopen("[^"]*", "r")'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente ve ENOENT en una traza y cree que el programa está fallando. Un programa pide a menudo archivos que pueden no estar, y sigue. En una traza completa, el cargador falla con /etc/ld.so.preload y es normal. Importa la ruta que el programa busca por su cuenta.

Crear el archivo confirma la lectura

La traza dice qué archivo busca el programa. Para confirmarlo, crea ese archivo vacío con touch y vuelve a ejecutar licencia. Después bórralo con rm.

Es un archivo de tu copia, en /tmp, que el programa de ejemplo busca. No cambias nada más.

Crea el archivo que busca

Comando
touch /tmp/.tienda-licencia

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejecuta licencia otra vez

Comando
/tmp/licencia

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Borra el archivo de prueba

Comando
rm /tmp/.tienda-licencia

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Para ir más lejos

Ejecuta strace -c /tmp/licencia en el terminal. La opción -c no escribe las llamadas una a una: resume cuántas hizo de cada tipo y cuántas fallaron.

Explica con tus palabras cuándo te interesa más ese resumen que la traza entera.

Sobre este laboratorio y su código: Laboratorio de ingeniería inversa: leer programas con gdb, radare2, strace y ltrace en una VM

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.