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 :
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".
or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
![image alt](https:// "title") | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Syncing