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
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| radare2 | un outil en ligne de commande pour lire un binaire | r2 |
| Analyse | un premier travail qui repère les fonctions et les textes | aa |
| Branche | un endroit où le programme peut prendre deux chemins | |
| Bloc | une suite d’instructions sans saut au milieu | |
| Graphe | un dessin des blocs et des sauts entre eux | agf |
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
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.cAffiché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
gcc -O0 -no-pie -fno-stack-protector -o tarif tarif.cAffiché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
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
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 ligne | Ce qu’elle dit | Pour la ligne du saut |
|---|---|---|
| 0x0040116c | L’adresse de l’instruction | Où elle est dans le fichier |
| 7f07 | Les octets de l’instruction | Son code machine, deux octets |
| jg 0x401175 | L’instruction et ses opérandes | Sauter à 0x401175 si plus grand |
| ,=< à gauche | Le départ d’une flèche de saut | La 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
r2 -q -e scr.color=0 -c 'aa' -c 'pdf @ main' tarif 2>/dev/null | grep eurosAffiché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.