Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Lire un programme avec radare2

Après cette leçon: Je peux trouver avec radare2 où un programme décide et quelle comparaison le fait.

Leçon de 60 min5 commandesLab de rétro-ingénierie : lire des programmes avec gdb, radare2, strace et ltrace dans une VM

Où le programme choisit-il 7 ou 12 euros ?

radare2, que l’on écrit aussi r2, est un outil libre en ligne de commande qui désassemble un programme et dessine ses chemins. Il permet de trouver l’endroit exact où un programme décide.

Le programme tarif de la leçon précédente répond 7 ou 12 euros. Dans le fichier, une seule comparaison fait ce choix. Rappel : seuls les programmes de votre labo se lisent ici.

À la fin de cette leçon

Remarque

Je peux trouver avec radare2 où un programme décide et quelle comparaison le fait.

Mots-clés

MotCe que ça veut direExemple
radare2un outil en ligne de commande pour lire un binairer2
Analyseun premier travail qui repère les fonctions et les textesaa
Brancheun endroit où le programme peut prendre deux chemins
Blocune suite d’instructions sans saut au milieu
Grapheun dessin des blocs et des sauts entre euxagf

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

radare2 commence par analyser le fichier

La commande r2 ouvre un binaire. L’option -q quitte à la fin, -e scr.color=0 retire les couleurs et -c donne une commande à exécuter. La commande aa lance l’analyse : radare2 repère les fonctions et les textes. Ensuite, afl liste les fonctions.

Les deux premiers Runs recréent tarif s’il manque. Le dernier garde les lignes qui finissent par sym.prix ou main, avec leur adresse et leur taille en octets. 2>/dev/null masque les messages de l’analyse.

Recréer le programme tarif.c

Commande
printf '%s\n' '#include <stdio.h>' '#include <stdlib.h>' 'int prix(int age) {' '    int p = 12;' '    if (age < 26) p = 7;' '    return p;' '}' 'int main(int argc, char **argv) {' '    if (argc != 2) return 2;' '    printf("%d euros\n", prix(atoi(argv[1])));' '    return 0;' '}' > tarif.c

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Le compiler avec les réglages du labo

Commande
gcc -O0 -no-pie -fno-stack-protector -o tarif tarif.c

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Lister les fonctions prix et main

Commande
r2 -q -e scr.color=0 -c 'aa' -c 'afl' tarif 2>/dev/null | grep -E ' (sym\.prix|main)$'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

La commande pdf @ imprime une fonction

pdf @ sym.prix imprime le désassemblage de la fonction prix. Le signe @ veut dire « à cet endroit ». radare2 ajoute des flèches à gauche : elles relient chaque saut à sa destination.

Le Run garde les deux lignes qui comptent, la comparaison et le saut. Vous voyez la décision sans lire le reste.

Garder la comparaison et le saut

Commande
r2 -q -e scr.color=0 -c 'aa' -c 'pdf @ sym.prix' tarif 2>/dev/null | grep -E 'cmp|jg'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Exemple travaillé : lire une ligne de pdf

Partie de la ligneCe qu’elle ditPour la ligne du saut
0x0040116cL’adresse de l’instructionOù elle est dans le fichier
7f07Les octets de l’instructionSon code machine, deux octets
jg 0x401175L’instruction et ses opérandesSauter à 0x401175 si plus grand
,=< à gaucheLe départ d’une flèche de sautLa flèche finit sur la ligne 0x401175

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Un graphe dessine les deux chemins d’une branche

Une branche sépare le programme en deux chemins. agf @ sym.prix dessine les blocs de la fonction et les flèches entre eux. Sous le bloc qui contient jg, radare2 écrit f et t.

t mène au bloc où le saut est pris. f mène au bloc suivant, quand le saut n’est pas pris. Le diagramme montre ce que radare2 dessine pour prix.

Retrouver le texte que main affiche

Commande
r2 -q -e scr.color=0 -c 'aa' -c 'pdf @ main' tarif 2>/dev/null | grep euros

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Erreur fréquente

Attention

Beaucoup de gens pensent que le chemin t est le chemin normal du programme. t veut dire que le saut est pris, f que le programme continue à la ligne suivante. Lisez toujours la condition du saut avant de dire quel chemin va avec quel résultat.

Pour aller plus loin

Lancez pdf @ main en entier, sans grep. Dans main, trouvez la comparaison suivie de je : avec quel nombre le programme compare-t-il le nombre d’arguments ?

Dites ce que le programme fait quand l’égalité est fausse. Vérifiez en lançant ./tarif sans argument : le programme ne répond rien.

À propos de ce labo et de sa source: Lab de rétro-ingénierie : lire des programmes avec gdb, radare2, strace et ltrace dans une VM

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.