Qué es radare2
radare2 es una herramienta de línea de comandos que desensambla un binario y da nombre a lo que encuentra: funciones, textos y saltos. Con ella localizas el punto exacto donde un programa decide si algo es válido o no.
Un programa que comprueba un código de descuento tiene un punto así: una comparación y un salto. Esta lección enseña a encontrarlo.
Al final de esta lección
Nota
Puedo encontrar la instrucción donde un programa decide qué camino seguir.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| radare2 | una herramienta para analizar y desensamblar binarios | r2 |
| Análisis | pedir a radare2 que busque funciones y textos | aa |
| Función | un tramo de código con nombre que se puede llamar | |
| Bloque básico | un tramo de instrucciones sin saltos por el medio | |
| Referencia cruzada | un lugar del código que usa un dato o llama a una función |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
radare2 analiza y pone nombres
Si escribes r2 archivo, entras en una consola propia de radare2, de la que sales con q. Los Runs usan -q y -c para que cada uno haga una cosa y termine.
aa pide el análisis. pdf @ main imprime la función main desensamblada. Recuerda la regla: solo programas del laboratorio. El primer Run crea tienda, un programa de ejemplo nuestro.
Crea el programa de ejemplo tienda
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.
Filtra las líneas clave de main
r2 -q -e scr.color=0 -c aa -c 'pdf @ main' /tmp/tienda 2>/dev/null | grep -E "cmp|test|call|j[a-z]+ "Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un salto parte main en caminos
Lee las líneas en orden. El primer cmp mira cuántos argumentos hay. Después viene un call a strcmp, que compara dos textos.
strcmp deja un cero en eax si los textos son iguales. test eax, eax mira ese valor, y jne salta al mensaje de error si no es cero. El diagrama dibuja los caminos.
Pregunta quién usa el texto del código
r2 -q -e scr.color=0 -c aa -c 'axt str.REBAJAS26' /tmp/tienda 2>/dev/nullSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cuenta los bloques básicos de main
r2 -q -e scr.color=0 -c aa -c 'afb @ main' /tmp/tienda 2>/dev/null | wc -lSe 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 cree que el jne que sigue a strcmp es el salto del éxito. Es al revés. jne salta cuando el resultado no es cero, es decir, cuando los textos son distintos. Con el código correcto, el programa sigue recto.
Para ir más lejos
Ejecuta r2 -q -e scr.color=0 -c aa -c izz /tmp/tienda en el terminal. izz lista todos los textos del binario, no solo los de la parte de datos.
Compara la lista con la de strings. Después explica con tus palabras qué ventaja tiene que radare2 diga además qué función usa cada texto.