VPTR Exploitation C++

VPTR (ou Virtual Pointer) est un pointeur qui pointe vers l'entrée d'un tableau de pointeur sur fonction d'une classe. Ces pointeurs sur fonction pointent eux-mêmes vers les méthodes relative à la classe.

Il y a une VTABLE pour chaque classe et donc un VPTR pour chaque VTABLE.

Reprennons un bout de code du chall C++ de Root-Me pour montrer un exemple :

class UpperFormatter: public formatter { public : virtual int RTTI( ) { return 1; }; virtual void displayName( ) { printf ("UpperFormatter"); } virtual void format( const char * ptr ) { const char * cptr = ptr; while (*cptr) { printf("%c", toupper(*cptr)); cptr++; } } };

Ici nous avons une classe UpperFormatter avec trois méthodes (fonctions), une méthode RTTI(), displayName() et format().

Avec un peu de recherche on trouve rapidement la VTABLE de la classe UpperFormatter et ce qu'elle contient et on peut voir qu'on y retrouve nos fonctions citées précédemment :

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Ici en vert on peut voir le VPTR, et dans les autres couleurs la VTABLE avec les pointeurs vers les trois méthodes de la classe.

                  .----------------------------------.
           .------| VPTR to VTABLE of UpperFormatter |
           |      '----------------------------------'
           |
.-------------------------------------------.
|  UpperFormatter VTABLE   |     METHOD     |
|--------------------------|----------------|
|  RTTI()'s pointer        |  RTTI()        |
|  displayName()'s pointer |  displayName() |
|  format()'s pointer      |  format()      |
'--------------------------'----------------'

Généralement le VPTR est situé juste après le buffer donc on peut potentiellement écraser le VPTR pour faire pointer autre part dans la mémoire. On peut donc créer par exemple sa propre "VTABLE".

Select a repo