Radare 2
Author: Pablo San Emeterio Día : Día 1
Contexto general
Esta charla va de cómo usar radare2 (r2) para analizar binarios, hacer reversing y resolver retos de cracking. El rollo es aprender el flujo básico de trabajo: desde abrir un binario hasta descompilarlo y entender qué hace el código a nivel de ensamblador. Se cubren los comandos esenciales, cómo integrar decompiladores (Ghidra) y hasta cómo usar IA para ayudar con la descompilación. Es especialmente útil para CTFs y análisis de malware.
Conceptos clave
- Comandos de información básica:
i(info general),ii(imports),iS(secciones),iS=(secciones visual),iz(strings data),izz(todas las strings) - Análisis del binario:
aaaanaliza todo el binario (funciones, referencias, etc.),afllista todas las funciones encontradas - Navegación:
s mainte mueve a la función main, básicamente es como hacer un "seek" a esa dirección - Desensamblado:
pdf(print disassemble function) muestra el desensamblado de la función actual - Modo visual:
VVentra en modo visual con grafos de flujo, muy útil para ver branches y seguir el flujo del programa - Descompilación con Ghidra:
pdgusa el decompilador de Ghidra integrado en r2 - Descompilación con IA:
decai -ddescompila usando IAdecai -xextrae y analiza con IA- Configuración para ChatGPT:
decai -e api=openai,decai -e model=gpt-4,decai -e lang=c,decai -e hlang=es,decai -e cmds=pdc,pdg,pdd
Desarrollo técnico
El flujo típico de trabajo en r2 sería: abres el binario con r2 ./binario, haces un análisis completo con aaa, luego afl para ver qué funciones hay. Te mueves a main con s main y empiezas a investigar con pdf o entras en modo visual VV para ver el grafo de control.
Para reversing más cómodo, usas pdg que tira del decompilador de Ghidra y te da pseudocódigo en C. Si el código es complejo o quieres ayuda extra, decai te puede echar un cable usando modelos de IA (local con Ollama o cloud con OpenAI) para explicar qué hace el código y hasta traducirlo a lenguaje natural.
Herramientas y comandos mencionados
Instalación de herramientas:
- Ghidra:
apt install ghidra - radare2: clonar desde GitHub y ejecutar
./sys/install.sh - r2ghidra:
r2pm -U && r2pm -ci r2ghidra(decompilador Ghidra para r2) - r2dec:
r2pm -ci r2dec(otro decompilador) - r2ai:
r2pm -ci r2ai && r2pm -ci r2ai-server && r2pm -ci decai(soporte IA) - Ollama:
curl -fsSL https://ollama.com/install.sh | shy luegoollama run qwen2.5:latest
Comandos r2 clave:
aaa→ análisis completo del binariopdf→ desensamblado de función actuals main→ ir a mainVV→ modo visual con grafospdg→ decompilador Ghidradecai -d→ descompilar con IA
Ejemplos prácticos de reversing
Ejemplo 1: Comparación simple con strcmp
El programa pide una contraseña y usa strcmp para compararla con "THisISMyCheckIt2025==". En ensamblador verías algo como:
call sym.imp.gets ; lee input
lea rdi, [buffer]
lea rsi, str.THisISMyCheckIt2025__
call sym.imp.strcmp ; compara
test eax, eax ; si retorna 0 = iguales
jne fail ; si no es 0, salta a fail
Bypass: Puedes parchear el jne por un je (invertir el salto), o directamente saltar el strcmp y forzar que eax sea 0 antes del test. También puedes simplemente sacar la string de memoria con izz y listo.
Ejemplo 2: Comparación char a char
Este es más retorcido. Compara cada posición del buffer contra un char específico:
buffer[0] == 'E'buffer[1] == 's'buffer[2] == 't'- etc.
La contraseña correcta sería: EstaVezNoHayFuncion2025==
En ensamblador verías un montón de comparaciones consecutivas:
cmp byte [rbp-0x12c], 0x45 ; buffer[0] == 'E'
jne fail
cmp byte [rbp-0x12b], 0x73 ; buffer[1] == 's'
jne fail
...
Bypass: Puedes parchear todos los jne para que nunca salten (convertirlos a nop), o directamente reconstruir la string mirando todos los valores que compara en orden. Con pdf y paciencia, sacas los chars uno a uno.
Conclusiones
Radare2 es bestial para reversing si te aprendes el workflow básico: analizar, navegar, desensamblador/decompilador, y modificar si hace falta. La integración con Ghidra y las herramientas de IA hacen que sea mucho más llevadero entender qué hace un binario sin tener que leer ASM puro durante horas.
Para retos tipo CTF, el combo aaa + afl + s main + pdg te resuelve el 80% de los challenges básicos. Para cosas más complejas, tener decai configurado con un modelo decente puede ahorrarte un montón de tiempo.
Para investigar más
- Aprender a usar r2pipe para scripting y automatización
- Profundizar en patching de binarios con r2 (comandos
w) - Estudiar más sobre análisis de malware con r2
- Explorar r2frida para análisis dinámico en Android/iOS
- Comparar r2 vs Ghidra standalone vs IDA para ver qué herramienta va mejor según el caso