Annonce

Réduire
Aucune annonce.

Récupérer un mot de passe à partir d'un exécutable

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Récupérer un mot de passe à partir d'un exécutable

    Bonjour tout le monde
    Je suis un nouveau membre dans ce forum et j'espère passer des périodes agréables ici et surtout connaitre des gens passionnés par la sécurité informatique
    Désolé pour mon Français, il me parait qu'il n'est pas parfait

    Dans ce petit tutoriel je vais présenter une petite technique de récupération d'un mot de passe à partir d'un exécutable

    L'exécutable écrit en C demande un mot de passe et vérifie si il est correct
    Notre mission est de découvrir le mot de passe correct

    voilà la source

    Code:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main(void)
    {
            char *mystr=(char*)malloc(sizeof(char)*50),*mypass=(char*)malloc(sizeof(char)*50);
            strcpy(mypass,"MyPassword!!");
            printf("[~] Please Enter your Password Here: ");
            fgets(mystr,49,stdin);
            if (!strcmp(strcat(mypass,"\n"),mystr) )
                    printf("\n\n[~] Right Password!\n\n");
            else
                    printf("\n\n[!] Wrong Password!\n\n");
            system("PAUSE");
            return 0;
    }
    Bien sur on ne dispose pas de ce code source
    juste l'exécutable

    Je vais utiliser Imuunity Debugger mais vous êtes libres à utiliser ce que vous voulez

    Comment doit t on réfléchir ?

    Avant de commencer le processus de reverse on doit poser la question "Que voulons bous faire ?"
    Dans notre cas on désire savoir un mot de passe secret
    Il ya plusieurs méthodes pour ce faire
    On peut dégager toutes les chaines utilisées dans l'exécutable
    On peut aussi considérer touts les appels modulaires qu'a fait l'exécutable et chercher la fonction qui compare 2 chaines
    et par la suite voir les valeurs de la Stack juste après l'appel de cette fonction
    On va suivre ce démarche

    Chaque OS possède ses propres fonctions pour faire ses traitements
    La bibliothèque Win32 API est développée par Microsoft et est destiné pour faire les traitements sous Windows

    La fonction utilisée par Win32 API pour comparer 2 chaines est strcmp (NE PAS CONFONDRE avec strcmp en C)
    On va chercher l'instruction d'appel de cette fonction dans notre exécutable et on va considérer l'état de l'exécutable juste après cet appel
    On va débugger l'exécutable à partir ce cet appel


    1.jpg

    Voilà la liste des appels modulaires de cet exécutable
    2.jpg

    Voilà l'adresse de l'appel de strcmp
    3.jpg

    On clique sur F2 pour créer un point de départ et F9 pour démarrer l'exécutable
    C'est à dire on va exécuter notre programme à partir de ce point ==> debugger
    On remarque que l'exécutable s'ouvre et il nous invite à introduire un mot de passe pour que la strcmp la compare avec le vrai mot de passe
    On introduit un mot qqe

    Voilà les valeurs stockée dans la mémoire stack
    Les paramétres des fonctions appelés sont chargés dans cette mémoire
    la fonction strcmp prend 2 paramètres (la chaine introduite par l'utilisateur et le vrai mot de passe)

    4.png

    On en déduit que le mot de passe est "MyPassword!!"
    Vous pouvez tester l'exécutable avec le mot de passe ainsi déduite

    C'est tout pour aujourd'hui

    Merci pour votre attention
    S'il ya des questions n'hésitez pas à les poser

  • #2
    Donc tu considères que le mot de passe est en clair dans le code exécutable ?

    Commentaire


    • #3
      Envoyé par fred Voir le message
      Donc tu considères que le mot de passe est en clair dans le code exécutable ?
      oui exactement
      c'est un exemple relativement simple d’initiation

      Commentaire


      • #4
        Sur un code aussi simple, je fais un strings depuis une distro GNU/Linux et le password apparaît.
        WITHOUT DEVIATION FROM THE NORM, PROGRESS IS NOT POSSIBLE
        -Frank Zappa

        Commentaire


        • #5
          Effectivement, cette solution est la plus simple ahah

          Commentaire


          • #6
            Il y a quand même des choses à dire dans le code (qui pourtant est ridiculement petit), j'ai un peu de temps, j'y vais
            1. Il n'est pas assez aéré, ce qui est gênant quand on veut en donner des explications
            2. Pourquoi allouer de la mémoire dynamiquement alors qu'il est exactement de la même manière faisable statiquement
            3. Si on alloue dynamiquement, alors on oublie pas de libérer la mémoire allouée avec free
            4. Certaines fonctions retournent une valeur ou une adresse, ce n'est pas pour faire beau, il faut utiliser ces retours !
            5. system("PAUSE") retire la solution portable, ce qui est gênant quand on sait que 80% des membres utilisent un système UNIX



            Ça c'est pour la forme, car si je présente un cas de figure, j'essaye de rendre cela sans faute, et vu le nombre d'erreurs, je dirais que ce n'est pas le cas!

            Voilà ta solution en plus simple.

            Code:
            #include<stdio.h>
            #include<stdlib.h>
            #include<string.h>
            
            #define SIZE_MAX 50
            
            int main(void)
            {
                    char mystr[SIZE_MAX];
                    const char *mypass = "MyPassword!!";
            
                    char *p = NULL; /* retour de fgets et strchr */
            
                    printf("[~] Please Enter your Password Here: ");
            
                    if ((p=fgets(mystr, SIZE_MAX, stdin)) == NULL)
                        return EXIT_FAILURE;
            
                    p = strchr(mystr, '\n');
                    if (p != NULL)
                        *p = '\0';
            
                    if (strcmp(mypass, mystr) == 0)
                            printf("\n\n[~] Right Password!\n\n");
                    else
                            printf("\n\n[!] Wrong Password!\n\n");
            
                    return 0;
            }
            Désolé, c'était plus fort que moi...

            Pour le fond je laisse les autres en parler, ce qui me surprend est de voir un mot de passe en clair dans un fichier.
            Dernière modification par fred, 06 novembre 2015, 20h56.

            Commentaire


            • #7
              Je trouve dommage que l'on trouve systématiquement des tuto d'initiation au reverse basé sur ollydbg et dérivé (imunity) et pratiquement jamais de tuto axé sur d'autres outils (gdb, strings, strace, ltrace, hexdump etc..).

              Malheureusement je ne suis pas expert de ces outils (trop peu de pratique) pour pouvoir en faire un tutoriel sérieux mais je trouve que des tutoriels portant sur ces outils ne serait pas un luxe vu le peu de tuto french sur ces outils.
              WITHOUT DEVIATION FROM THE NORM, PROGRESS IS NOT POSSIBLE
              -Frank Zappa

              Commentaire

              Chargement...
              X