0x01. SYNOPSIS FRANCAIS
Usage: ltrace [option ...] [commande [argument ...]] Trace des bibliothèques d'un programme donné en argument. -a, --align=COLUMN aligne les valeurs retournées dans une colonne spécifiée -c compte le temps et les appels et créé un rapport à la sortie -C, --demangle décode les noms de symboles bas-niveau (ring0) dans les noms de niveau utilisateurs (ring3) -d, --debug affiche des informations de débogage -e expr selectionne les évènements à tracer -f suit les execution fils -h, --help affiche ce message d'aide -i affiche le pointeur d'instructions au moment de l'appel de la bibliothèque -l, --library=FILE affiche les appels de bibliothèques depuis le fichier spécifié uniquement -L n'affiche pas les appels de bibliothèques -n, --indent=NR indente l'affichage avec des saut de lignes pour chaque appel -o, --output=FILE ecrite les appels dans un fichier -p PID attache le process avec l'identifiant du processus -r affiche les temps relatifs -s STRLEN spécifie le nombre de caractères maximum par chaines ed caractères -S affiche les appels systèmes -t, -tt, -ttt affiche les temps UNIX en absolu -T affiche le temps écoulé entre chaque appel -u USERNAME execute le prgoramme avec un auter identifiant -V, --version affiche les informations sur la version du programme -x NAME traite la variable globale NAME comme une bibliothèque de sous-routine -X NAME de même que -x: et le PLT sera initialisé à partir d'ici Rapportez les défauts à Juan Cespedes
0x02. CRACKME
Il n'est pas difficile de trouver des crackmes à difficulté variable, seulement c'est très souvent pour Windows, pour cause: c'est le système d'exploitation le plus utilisé. Il y'en a cependant aussi dans Linux. Voici donc une méthode de faire.
0x03. INSTALLATION
Pour l'installation des systèmes à base de Debian, il suffit d'un
apt-get install ltrace
0x04. EXEMPLE D'UN CRACKME
ltrace ./crackme20
__libc_start_main(0x8048498, 1, 0xbff5af14, 0x8048600, 0x8048660 <unfinished ...> puts("... Crackme de Test fo"...... Crackme de Test for Linux ... ) = 45 fwrite("Entrez le mot de passe pour vali"..., 1, 38, 0xb7f204e0) = 38 fgets(Entrez le mot de passe pour valider : abcdef "qsd\\n", 50, 0xb7f20440) = 0xbff5ae22 strcmp("\\97\\98\\99\\100\\101\\102", "\\57\\97\\71\\110\\51") = 1 puts("J'ai bien peur que non... reesay"...J'ai bien peur que non... reesaye encore ;-) ) = 46 +++ exited (status 255) +++
On voit clairement que grâce à ltrace le mot de passe "semble" visible, car la fonction du langage C strcmp est appelée. Il suffit donc d'arriver à interpréter les paramètres passées à la fonction strcmp
0x05. REVERSING
Le but est maintenant de reverser, soit de retrouver la manière dont le passe a été définie. Dans ce cas, la méthode est terriblement simple, dans la mesure oà le code ASCII de 'a' correspond à 0x61, soit 16*6+1 c'est à dire 97. Il suffit de retrouver les caractères correspondants aux codes ASCII de la chaines de comparaison :
décimal: 48 57 hexa : 0x30 ... 0x39 octet : 0 9 décimal: 65 91 hexa : 0x41 ... 0x5B octet : A Z décimal: 97 123 hexa : 0x61 ... 0x7B octet : a z
Ce qui nous fait donc le mot de passe suivant :
9aGN3
soit "gagné" en 1337 5P34K (leet speak).
=> Écrit par : Nicolas, le 07 mai 2008