recherche de vulnérabilités / 5. la pile
La pile x86 pendant un appel de fonction
Convention cdecl, 32 bits. On suit foo(5, 6) appelée depuis main, puis le printf qui suit. Boutons ou flèches du clavier.
int foo(int a, int b) { int c; c = a + b; return c; }
int main() { foo(5, 6); printf("bye\n"); return 0; }
argumentssauvegardes (retour, EBP)variable localedonnée morte (hors pile)
À retenir
- La pile grandit vers les adresses basses : chaque
pushfaitESP -= 4. call= empiler l'adresse de retour + sauter.ret= dépiler cette adresse dans EIP, en lisant la case pointée par ESP.- Le prologue (
push ebp / mov ebp, esp / sub esp, N) crée la frame. Dans la fonction : retour à[ebp+4], arguments à[ebp+8],[ebp+12]…, locales à[ebp-4]… leave=mov esp, ebp+pop ebp. C'est cepopqui amène ESP sur l'adresse de retour.- En cdecl, c'est l'appelant qui nettoie les arguments (
add esp, 8) après le retour. - Côté vulnérabilité : un buffer local qui déborde écrase, vers les adresses hautes, l'ancien EBP puis l'adresse de retour. Au
ret, le processeur saute là où l'attaquant a écrit.