Enfaite, EBP (appelé pointeur de base) pointe sur le bloc d'activation de la fonction en cours (dans la pile). Un bloc d'activation est est crée à chaque fois qu'une fonction est appelée (même main). Il est placé au dessus du bloc d'activation de la fonction qui l'a appelée, en remontant vers les adresses mémoire basses . C'est une façon de diviser la mémoire de la Pile. Chaque fonction à donc son bloc d'activation qui contient les variables locales de la fonction en cours. C'est pour cette raison que deux variables portant le même nom mais dans deux fonctions différentes peuvent avoir des valeurs différentes. C'est ce qu'on appéle la portée des variables.
Tu sais que la Pile marche en FILO (premier entré, dernier sorti) ? Donc quand une fonction est appelée, un nouveau bloc d'activation est crée. Le processeur va empiler dans l'ordre suivant :
- Les arguments de la fonction
- L'adresse de retour
- La sauvegarde de l'EBP (appelé SFP dans ce cas là)
- Variables locales à la fonction.
Vu que ces informations sont empilées, il faut que tu imagines la chose à l'envers. Quand tu fais un buffer Overflow, le tampon va dépasser sur les autres variables locales (si il y en a), il va écraser la SFP et par la suite l'adresse de retour (l'EIP sauvegardé).
J'espère que ça va t'aider à compendre. J'ai écris ces lignes un peu en vrac mais je suis entrain de finir mon article sur la segmentation de la mémoire qui sera beaucoup plus explicite. Bien comprendre comment la mémoire marche est la première étape pour faire du Buffer Overflow.
Bonne chance pour la suite
