2017-06-08 2 views
0

Je suis en train d'apprendre à propos de la destruction de la pile et j'ai trouvé un exemple qui, pour moi, ne fonctionne pas comme prévu. J'ai le code suivant:Des octets supplémentaires sur la pile lors de la tentative d'écrasement de la pile dans C

#include <stdio.h> 

GetInput() { 
    char buffer[8]; 
    gets(buffer); 
    puts(buffer); 
} 

main() { 
    GetInput(); 
    return 0; 
} 

lors de l'exécution du code GDB avec des points d'arrêt à « GetInput() » et « gets (buffer) » et l'affichage de la pile au premier et le deuxième point de rupture me donne la suivant:

En regardant la pile, 20 octets y sont poussés. Ce 20 octets devrait être le suivant: 8 octets pour le tampon, 4 octets pour l'ancienne valeur de EBP et 4 autres octets pour l'adresse de retour. et il y a encore 4 octets dont je ne suis pas sûr d'où il vient. Quelqu'un pourrait-il s'il vous plaît expliquer pourquoi est-il 20 octets au lieu de 16

+0

Quel est le type de retour 'GetInput'? Que signifie * EBP *? En général, le mieux est de vérifier le code d'assemblage. https://en.wikipedia.org/wiki/Call_stack – tilz0R

+0

@ tilz0R EBP est un registre de pointeur de données de pile. –

+1

Avez-vous désactivé la protection/détection de destruction de pile lors de la construction? –

Répondre

0

Rembourrage

Selon le compilateur utilisé et la version de ce compilateur et même les options d'optimisation, différente quantité de remplissage peut être poussé sur la pile dans des endroits différents pour des raisons différentes. Votre compilateur peut insérer des canaris de pile pour détecter les dépassements de tampon. Il peut essayer d'améliorer l'alignement ou le comportement du cache. Il peut simplement être inefficace et gaspiller de l'espace.

Il n'y a aucun moyen de dire avec certitude, car chaque compilateur est différent, et la mise en page précise des variables locales n'est pas mandatée par une spécification ou un ABI.