Parte: 5 — Explotación de sistemas y binarios · Fuente: Andriesse, Practical Binary Analysis ⏱️ Duración estimada: 120 min · Nivel: Avanzado
Observar el binario en ejecución para revelar lo que el análisis estático no puede: valores en
runtime, rutas realmente tomadas, cadenas descifradas, llamadas a librería y syscalls. Combinarás
ltrace/strace, GDB con scripting, tracing con Frida y emulación selectiva, cerrando el ciclo
estático↔dinámico del reversing.
⚠️ Ética: ejecuta binarios desconocidos solo en una VM aislada (sin red hacia producción, snapshots antes/después). Solo binarios propios/autorizados.
Al finalizar, el alumno podrá:
ltrace/strace.| # | Tema | Por qué importa |
|---|---|---|
| 1 | Aislamiento (VM/snapshots) | Ejecutar sin riesgo |
| 2 | strace (syscalls) | Qué pide al kernel |
| 3 | ltrace (funciones de librería) | Argumentos reales de strcmp, etc. |
| 4 | GDB scripting | Breakpoints condicionales, hooks |
| 5 | Frida | Instrumentación dinámica flexible |
| 6 | Dump de memoria | Extraer cadenas descifradas |
| 7 | Emulación (Unicorn/qiling) | Ejecutar fragmentos sin todo el entorno |
| 8 | Cierre estático↔dinámico | Metodología combinada |
ltrace
muestra el strcmp(input, "clave") directamente.break f if x==0x41
evita paradas inútiles.dump memory.sudo apt install -y strace ltrace gdb
pip install frida-tools unicorn qiling
Usa una VM aislada con snapshot previo. Nunca ejecutes muestras desconocidas en tu host.
Entorno propio / VM aislada.
crackme:bash
strace -f ./crackme # open/read/write, etc.
ltrace ./crackme # a menudo revela strcmp(input, "SECRET")
Si ltrace muestra la comparación, ya tienes la clave. Si está ofuscada, sigue con GDB.
GDB con breakpoint condicional y hook automático:
gdb
break strcmp
commands
printf "cmp: %s vs %s\n", $rdi, $rsi
continue
end
run
javascript
// hook.js
Interceptor.attach(Module.getExportByName(null, "strcmp"), {
onEnter(args){ console.log("strcmp", args[0].readUtf8String(), args[1].readUtf8String()); }
});
bash
frida -f ./crackme -l hook.js
Vuelca memoria para extraer una cadena descifrada en runtime (dump memory out.bin $addr $addr+64).
(Opcional) Emula una rutina de descifrado con Unicorn/Qiling para obtener la salida sin el binario completo.
Verifica la clave deducida ejecutando el crackme.
crackme usando solo ltrace.strcmp sin detenerse.strace frente a ltrace.dump memory.Deduce la clave de un crackme que descifra su comparación en runtime, usando análisis dinámico
(ltrace, GDB o Frida).
Criterio de aceptación: obtienes la clave correcta y explicas con qué herramienta/hook la capturaste en el momento de la comparación.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
ltrace no muestra nada |
Binario estático o anti-ltrace; usa GDB/Frida |
| Frida "cannot find module" | Nombre de export incorrecto; usa null para el binario principal |
| Breakpoint condicional nunca dispara | Condición mal escrita; revisa el registro |
| Ejecutas malware en el host | ¡Riesgo! Usa VM aislada con snapshot |
| Cadena vacía en el dump | Rango/offset erróneo; ajusta con x/s antes |
❓ ¿ltrace o strace? ltrace para funciones de librería (más legible); strace para syscalls
(útil cuando no hay imports dinámicos claros).
❓ ¿Frida solo para móvil? No: funciona en Linux/Windows/macOS y es excelente para desktop y CTF.
❓ ¿Cuándo emular? Cuando quieres ejecutar una rutina de descifrado aislada sin montar todo el entorno del binario.
Clase 133 — Análisis estático de binarios