Introduction au reverse engineering (analyse dynamique)

Pour Linux

Outils de base

  • strace
  • ltrace
  • gdb

Code de base

#include <stdio.h>
#include <stdlib.h>

int main() {
    int c;
    FILE *file;
    file = fopen("test.txt", "r");
    if (file) {
        while ((c = getc(file)) != -1) putchar(c);
        fclose(file);
    }
}

strace

  • Permet de savoir en temps réel les "syscall"
  • Les "syscall" sont les appels systèmes qui sont faits pour lire des fichiers, exécuter des commandes, allocation de mémoire, etc.

Exemple

Options utiles

  • strace -s 1024 ... pour ne plus être embêter par la limite de caractères
  • strace --help ... pour toutes options

ltrace

  • Permet de savoir en temps réel les appels de librairies.

Exemple

GDB

  • Déboggeur en ligne de commande pour Linux
  • Disponible par défaut

Démarrer le programme

  • Pour ouvrir un programme avec GDB
    gdb [nom du programme]
     
  • "run" (démarre sans rien faire)
  • "start" (démarre et met automatiquement un breakpoint pour le symbole "main")

Breakpoints

  • Pour arrêter à un appel de fonction.
  • Commande : "b [nom de la fonction]"

Breakpoints

  • Pour arrêter à une adresse précise dans le code.
  • Commande : "b *0x[adresse]"

Breakpoints

  • Pour arrêter à un syscall.
  • Commande : "catch syscall [nom du syscall]"

Layout

  • Pour être plus efficace, on a des layouts !
  • Commande : "layout [nom du layout]"

Layout

  • "asm"

Layout

  • "regs"

Affichage de valeur

  • Commande "p" ou "print"
    • Affiche la valeur
    • Exemple : "p $eax"
       
  • Commande "x"
    • Affiche la valeur situé à l'adresse
    • Exemple : "x $eax"
       
  • "Modificateurs"
    • /s pour afficher une chaîne de caractères
    • /x pour afficher en hexadécimal
    • Exemple : "x/s $eax", "p/x $eax"

Naviguer dans le code

  • Commande "si" / "stepi"
    • Exécute une instruction (entre dans les call)
       
  • Commande "ni" / "nexti"
    • Exécute une instruction (n'entre pas dans les call)
       
  • ​Commande "finish"
    • Sort de la fonction courante (step out)
       
  • Avancer plus rapidement
    • Indiquer le nombre d'instruction. "ni 5"
    • Utiliser des breakpoints

Misc

  • Le UI a tendance à glitcher souvent avec les layouts. Utiliser "refresh" pour qu'il s'affiche correctement.

Questions ?

Exercice !

Introduction au reverse engineering (analyse dynamique)

By Olivier Arteau

Introduction au reverse engineering (analyse dynamique)

  • 1,258