III°) Les faux points d'arrêt (breakpoints)
Explication de la technique
Cette technique s'appuie sur les différences d'éxécution entre un programme seul et un programme dans un débuggueur. Une différence essentielle est l'interprétation du caractèresint 3, en hexadécimal, 0xCC. Ce caractère constitue les fameux breakpoints. Ces points d'arrêt sont associés au signal SIGTRAP. Quand un débuggueur lit un caractère 0xCC, il mets le programme en pause (ce qui permet de l'analyser à l'instant X). Quand un programme reçoit un SIGTRAP, il effectue l'action associée au signal (par défaut, il quitte). Le principe de cette méthode est simple : on modifie l'action effectuée par un SIGTRAP. Donc, un programme éxécuté normalement va suivre cette action, alors qu'un programme en cours de debug va se mettre en pause, puis continuer (et être piégé dans une partie du programme qui lui sera bien sûr réservée).
Illustration
Voici un exemple d'utilisation des faux breakpoints. Le programme suivant est le même que celui de la partie ptrace, légèrement modifié :
- //auth.cpp : Exemple de l'utilisation d'un faux breakpoint
#include <signal.h>
#include <iostream>
- using std::cout;
using std::cin;
using std::endl;
#include <string>
- using std::string;
#define MDP "exemple_pass"
void authentification(int signo) {
- string pass;
cout << "Authentification requise\nMot de passe :\t";
cin >> pass; //Capture clavier
if (pass == MDP) //Si la chaîne rentrée au clavier est pareil que la chaîne MDP définie plus tôt
cout << "Authentification réussie, bienvenue dans la suite du programme" << endl;
else cout << "Echec de l'authentification\nAbandon..." << endl; //Sinon
exit(0);
int main() {
signal(SIGTRAP, authentification); //réception de SIGTRAP => authentification()
__asm__("int3"); //On pose un breakpoint qui va envoyer un SIGTRAP
return 1; //On quitte en état d'erreur
- $ g++ auth.cpp -o auth && ./auth
Authentification requise
Mot de passe : testdepass
Echec de l'authentification
Abandon...
$ ./auth
Authentification requise
Mot de passe : exemple_pass
Authentification réussie, bienvenue dans la suite du programme
$ gdb -q auth
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) r
Starting program: /home/SeriousHack/auth
Failed to read a valid object file image from memory.
Program received signal SIGTRAP, Trace/breakpoint trap.
0x0804894c in main ()
(gdb) c
Continuing.
Program exited with code 01.
0 commentaires:
Enregistrer un commentaire