vendredi 3 décembre 2010

Utilisation de ltrace

Alors que dernièrement je faisais un petit challenge sur intruded.net, je me suis retrouvé confronté à un binaire qui me demandait un mot de passe. Un binaire très basique (dans les premiers niveaux) et j'avoue j'avais la flemme d'utiliser gdb.

Je me suis donc dit que peut être le binaire était suffisamment basique pour pouvoir être résolu juste avec la commande ltrace. La commande ltrace permet de tracer les appels fait par le programme à des fonctions situées dans des librairies partagées. Donc avec un peu de chance, le programme fait juste un strcmp entre la chaîne que l'on a entrée et le mot de passe attendu :)

Bien entendu, je ne vais pas montrer des exemples avec le binaire d'intruded.net car ça gâcherait le plaisir. Je vais donc baser mon exemple sur le programme suivant :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 16

void uncrypt(const int *pass, char *res) {
   int i;
   for(i=0;i   res[i] = '\0';
}


int main(int argc, char **argv) {
   char leurre[] = "ThePass";
   int xor_password[] = {216,152,200,254,217,152,207,251,152,216,248,220,155,249,207};
   char password[SIZE];
   char proposition[SIZE];

   uncrypt(xor_password,password);

   printf("password : ");
   fgets(proposition,SIZE,stdin);

   if(!strncmp(proposition,password,SIZE)) printf("ACCESS GRANTED\n");
   else printf("ACCESS DENIED\n");

   return EXIT_SUCCESS;
}
Comme on peut le voir avec la commande strings, le mot de passe n'apparaît pas étant donné que celui-ci est xoré.

time0ut# strings blog_pass
/lib/ld-linux.so.2
__gmon_start__
libc.so.6
_IO_stdin_used
strncmp
puts
__stack_chk_fail
stdin
printf
fgets
__libc_start_main
GLIBC_2.4
GLIBC_2.0
PTRhP
[^_]
password : 
ACCESS GRANTED
ACCESS DENIED
ThePass
Par contre on voit bien le leurre ;)
La commande ltrace nous permet de venir à bout de ce binaire très simple :
time0ut# ltrace ./blog_pass
__libc_start_main(0x80484fe, 1, 0xbfb8a474, 0x8048660, 0x8048650 
printf("password : ")                                                                                         = 11
fgets(password : test
"test\n", 16, 0x97c440)                                                                                 = 0xbfb8a394
strncmp("test\n", "s3cUr3dP3sSw0Rd", 16)                                                                      = 1
puts("ACCESS DENIED"ACCESS DENIED
)                                                                                         = 14
+++ exited (status 0) +++
Voilà notre binaire est cassé et le mot de passe trouvé : s3cUr3dP3sSw0Rd.
time0ut# ./blog_pass
password : s3cUr3dP3sSw0Rd
ACCESS GRANTED
A noter, il existe aussi la commande strace qui permet de tracer les appels systèmes.

1 commentaire:

  1. [...] Il y a aussi ce soft, qui permet de tracer les appels fait a des libraires, pour plus d’explication vous pouvez aller voir ici : Time0ut [...]

    RépondreSupprimer