mardi 10 décembre 2013

Un autre trick anti-gdb

gdb ouvre des files descriptor lorsqu'il est démarré.
Il devient donc très simple de détecter gdb depuis un binaire:
mitsurugi@mitsu:~/gdb$ cat close3.c
#include <stdio.h>
#include <stdlib.h>

cint main(void) {
   if (close(3)==0) {
      printf("Debugger detected, Bye\n");
      exit(0);
   }
   printf("Je suis dans le main\n");
}
mitsurugi@mitsu:~/gdb$

et c'est tout:
mitsurugi@mitsu:~/gdb$ gdb -n -q ./close3
Reading symbols from /home/mitsurugi/gdb/close3...done.
(gdb) r
Starting program: /home/mitsurugi/gdb/./close3 

Debugger detected, Bye
[Inferior 1 (process 15890) exited normally]
(gdb) q
mitsurugi@mitsu:~/gdb$ ./close3
Je suis dans le main
mitsurugi@mitsu:~/gdb$

Simple et efficace.

Ca se contourne tout aussi facilement, il existe plein de doc sur le sujet.

Le problème avec cette méthode, c'est que n'importe quel reverser la voit immédiatement. On pourrait imaginer des crackmes plus fins avec une détection silencieuse du genre:
mitsurugi@mitsu:~/gdb$ cat close3.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char etat[32] = "gentil";

int main(void) {
   if (close(3)==0) {
      strcpy(etat,"mechant");
   }
   printf("Je suis dans le main\n");
   printf("Je suis %s.\n", etat);
}

Ce qui donne:
mitsurugi@mitsu:~/gdb$ ./close3
Je suis dans le main
Je suis gentil.
mitsurugi@mitsu:~/gdb$ gdb -n -q ./close3
Reading symbols from /home/mitsurugi/gdb/close3...done.
(gdb) r
Starting program: /home/mitsurugi/gdb/./close3
Je suis dans le main
Je suis mechant.
[Inferior 1 (process 16571) exited with code 021]
(gdb) q
mitsurugi@mitsu:~/gdb$


Cet exemple n'est pas très représentatif, mais on peut imaginer un changement de magic number, un appel à une fonction qui ne se fait pas ou ce genre de choses.

Aucun commentaire:

Publier un commentaire