Prise en main de Ghidra

Ghidra est un logiciel libre de rétro-ingénierie développé par la NSA (Agence de sécurité nationale américaine).

ghidra

Il sert principalement à analyser des fichiers binaires, comme des malwares ou des exécutables, sans les exécuter.

Pour exploiter pleinement le logiciel, des connaissances en assembleur et programmation sont nécessaires.
Cette activité se résumera donc à une prise en main basique de Ghidra.

Le code source de Ghidra a été rendu disponible sur GitHub suite à sa déclassification en 2019 après une fuite via WikiLeaks.

💻 Travail n° 1 Rappels de compilation

🎯 Travail à faire :

  1. Visionner les 3 premières vidéos du MOOC “RIP : Rétro-Ingénierie de Programmes” de France Université Numérique link

  2. Dans Linux, exécuter l’exécutable login1 exe après l’avoir téléchargé et rendu exécutable (→ chmod +x login). Cet exécutable demande de s’authentifier et affiche un message différent selon que l’authentification a réussi ou non avant de quitter.

    jdoe@C14-15:~$ ./login1
    jdoe@C14-15:~$ ./login1
    Please login !
    . login    : root
    
    . password : admin
    Unknown user. Bye ! (1)
    1 Le programme quitte en indiquant de l’authentification a échoué.
  3. Ouvrir l’exécutable login1 avec :

    • cat

    • xxd (après l’avoir éventuellement installé avec sudo apt install xxd)

    • strings

    • objdump -s -M intel

    …​et découvrir l’identifiant et le mot de passe attendus pour parvenir à s’authentifier.

💻 Travail n° 2 Installation de Ghidra

L’installation de Ghidra ne nécessite qu’une extraction de l’archive dans lequel il est distribué.

Cependant, Ghidra repose sur une version précise de l’environnement de développement Java (JDK). Il faut donc l’installer au préalable.

Des informations supplémentaires sur la procédure d’installation peuvent être trouvées dans le Guide de démarrage link.

🎯 Travail à faire :

  1. Ouvrir le File Manager et se rendre sur Diskstation en tapant smb://Diskstation/install/ghidra.

  2. S’authentifier en tant qu’utilisateur anonyme

  3. Télécharger localement les fichiers :

    • OpenJDK21U-jdk_x64_linux_hotspot_21.0.9_10.tar.gz

    • ghidra_12.0_PUBLIC_20251205.zip

  4. Extraire l’archive OpenJDK21U-jdk_x64_linux_hotspot_21.0.9_10.tar.gz dans le dossier /opt :

    sudo tar -xzvf OpenJDK21U-jdk_x64_linux_hotspot_21.0.9_10.tar.gz -C /opt (1)
    1 /opt est le répertoire par défaut pour installer les logiciels ne faisant pas partie de la distribution Linux
  5. Extraire l’archive de Ghidra également dans /opt :

    sudo  unzip ghidra_12.0_PUBLIC_20251205.zip -d ../opt
  6. Ajouter de manière permanente les chemins du JDK et de Ghidra dans la liste des chemins accessibles par défaut (→ variable d’environnement PATH). Pour cela, ajouter la ligne suivante au fichier ~/.bashrc :

    export PATH=/opt/jdk-21.0.9+10/bin:/opt/ghidra_12.0_PUBLIC:$PATH
  7. Prendre en compte les modifications en tapant :

    source ~/.bashrc (1)
    1 On peut aussi écrire . ~/.bashrc
  8. Vérifier que Ghidra s’exécute lorsqu’on lance la commande suivante : ghidraRun

💻 Travail n° 3 1er analyse statique avec Ghidra

L’objectif de ce travail est d’utiliser Ghidra pour retrouver le mot de passe demandé suite à l’exécution du programme sachant que ce mot de passe est “chiffré” dans le code source.

🎯 Travail à faire :

  1. Une fois Ghidra lancé, créer un projet non partagé (Not shared project) nommé lab-ghidra depuis le menu File  New Project…​

  2. Importer l’exécutable login2 exe dans Ghidra :

    • soit en le “glissant-déposant” dans le projet lab_ghidra

    • soit en le sélection depuis le menu File  Import File…​

  3. Renseigner la boîte de dialogue qui s’affiche conformément à l’illustration ci-dessous :

    ghidra import

    L’option “Load libraries From Disk” permet une analyse plus poussée d’un exécutable qui fait appel à des librairies externes.

  4. Lorsqu’on valide la boîte de dialogue, l’importation se lance et une fenêtre de compte rendu s’affiche :

    ghidra import results
  5. En s’assurant que l’exécutable login2 est bien sélectionné dans le projet, lancer l’outil Codebrowser soit en cliquant l’icône codebrowser soit en double-cliquant sur l’exécutable login2.

    Ghidra propose alors de lancer son analyse avec ensemble d’options paramétrables.

    ghidra analysis options

    Garder les options proposées par défaut

  6. Dans la fenêtre “Symbol Tree”, cliquer l’identifiant main dans la catégorie “Functions”. Un listing en pseudo-C s’affiche alors dans la fenêtre “Decompile” :

    undefined8 main(void)
    
    {
      int iVar1;
      char local_58 [48];
      undefined1 local_28 [32];
    
      printf("Please enter password : ");
      __isoc99_scanf(&DAT_00102097,local_28);
      b64_encode(local_28,local_58);
      iVar1 = strcmp(local_58,appPassword);
      if (iVar1 != 0) {
        puts("\nBad password. Bye !");
                        /* WARNING: Subroutine does not return */
        exit(-1);
      }
      puts("\nWelcome !");
      return 0;
    }
  7. Analyser le pseudo-code C et, à partir de celui-ci, tenter de retrouver le mot de passe en clair réclamé par le programme login2

    La catégorie “Labels” de la fenêtre “Symbol Tree” permet de se déplacer en mémoire pour examiner le contenu d’objets globaux tels que des variables globales.

  8. Vérifier que le mot de passe trouvé est le bon en exécutant login2 depuis la ligne de commande.

    Ne pas oublier de rendre le fichier exécutable avec :

    chmod +x login2

💻 Travail n° 4 Travail de synthèse

L’objectif de ce travail est également de retrouver un mot de passe chiffré dans un exécutable.

Contrairement au travail précédent, le chiffrement est un peu plus…​“tordu” 🤪.

🎯 Travail à faire :

  1. Ajouter l’exécutable login3 exe dans le projet existant lab-ghidra dans Ghidra

  2. Retrouver le mot de passe réclamé par login3 lors de son exécution depuis la ligne de commande

🞄  🞄  🞄