| M e n u |
+ 1 + r 3 d
U 5 1 + 3
|
|
|
||
Pour ca, j'avourais kil faut des connaissances sur le fonctionnement du proc,
donc sur l'assembleur aussi, ainsi que la programmation et la compilation,
hé bien sur l'os.
+°+ R A P P E L +°+
Bon, une pile est en fait un espace mémoire réserver pour un prog.
Représentation d'une Pile
-------------------------
| | <-- Mémoire Haute (Stack Pointer - esp chez Intel)
| |
| | |
| | |
| | | Sens de remplissage
| | |
| | | de la pile
| | |
| | |
| | |
| | V
| |
| |
|__________________| <-- Mémoire Basse +Base de la Pile+ (Instruction Pointer - eip chez Intel)
Stack Pointer : contient l'adresse du prochain bloque mémoire libre dans la pile
Instruction Pointer : contient l'adresse de la prochaine instruction a exécuter
A savoir, dans une pile, on trouve tout ce que le prog a besoin pour tourner,
c-à-d, c arguments, c variables et son code (+ kk tits choses mais bon
pour le moment on vois ca en gros - en théorie devrais-je dire :-))
+°+ F I N (du rappel) +°+
+Bon, maintenant, kesske c un dépassement de buffer ?
-C la qu'interviennent les notions en programmation et compilation (pour ma part c).
Lorsque l'on déclare une variable, faut lui réserver de l'espace mémoire pour la stocké.
Stokage qui va s'effectuer dans la pile souvent.
Donc une espace mémoire est alloué dans la pile et on peux stocké notre data.
+Maintenant, que se passe t-il si on écrit une data plus grande que l'espace alloué ?
-Hé bien on écrase la suite de la mémoire, en l'occurence pour la pile vu son
sens de remplissage, il est facile de placer une instruction valide pour le
proc dans la pile a la bonne place de l'Instruction Pointer,
d'où le proc se fais une joie d'exécuter sans mal ;-)
Un ptit code source qui donne l'adresse en hexadécimal du Stack Pointer :
% cat sp.c long get_esp() { __asm__("movl %esp,%eax\n"); } int main( void ) { printf( "SP : 0x%lx\n", get_esp() ); } % gcc sp.c -g -o sp % ./sp % SP : 0xbffffd04
Bonne ExploiT
|