Bonjour à tous! J'essaie de comprendre comment fonctionne le débordement de tampon. En ce moment, je suis en train de déterminer l'adresse de retour d'une fonction que je suis supposé changer pour effectuer une attaque de débordement de tampon. J'ai écrit un programme simple basé sur un exemple que j'ai lu sur internet. Ce que fait ce programme est qu'il crée un pointeur entier pour stocker l'adresse de retour de la fonction dans la pile. Pour ce faire, (étant donné que je comprends comment les variables d'une fonction/programme sont organisées dans la pile), j'ajoute 8 à l'adresse de la variable tampon et la place comme valeur de ret. Je ne fais rien ici qui changerait l'adresse contenue dans l'emplacement de l'adresse de retour de func. MISE À JOUR: J'ai modifié le programme un peu, donc il imprime l'adresse de la pile du paramètre func a. Comme vous pouvez le voir, la distance entre a et buffer est d'environ 8 octets, ce qui signifierait probablement, en fonction de la disposition de la pile, que FP et EIP (adresse de retour func) sauvegardés sont entre les deux. Ai-je raison?l'adresse de retour de la fonction est différente de sa valeur supposée, buffer overflow, AIDE SVP
Voici le programme:
void func(int a){
char buffer[3];
int *ret;
ret = buffer + 11; // this is the configuratio which made the whole program works... This now points to the address containing func's return address
printf (" address of a is %d\n", &a);
printf ("address of buffer is %x\n", buffer);
printf ("address of ret is %x\n", ret);
printf ("value of ret is %x\n", (*ret));
}
void main(){
int num;
num = 0;
func(num);
num = 1;
printf("Num now is %d", num);
}
sortie du programme quand se fait étét exécutée:
alt text http://img20.imageshack.us/img20/2034/72783404.png
Comme vous pouvez le voir, j'imprime l'adresse des variables tampon et ret. J'ai ajouté une instruction supplémentaire imprimant la valeur de la variable ret (supposée emplacement de l'adresse de retour de func, donc ceci devrait imprimer l'adresse de l'instruction suivante qui sera exécutée après que fonc retourne de l'exécution).
Voici le vidage qui montre l'adresse supposée de l'instruction à exécuter après le retour de func. (Souligné en vert) Comme vous pouvez le voir, cette valeur est très différente de la valeur imprimée contenue dans la variable ret.
alt text http://img717.imageshack.us/img717/8273/assemblycodecopy.png
Ma question est, pourquoi sont-ils différents? (bien sûr dans l'hypothèse que ce que j'ai fait est correct). Sinon, qu'ai-je fait de mal? Ma compréhension de la pile d'exécution du programme est-elle fausse? S'il te plaît, aide-moi à comprendre ça. Mon projet est attendu la semaine prochaine et je l'ai à peine touché. Je suis désolé si je suis exigeant, j'ai terriblement besoin de votre aide.
Veuillez inclure le texte de votre code actuel (pas seulement des captures d'écran) dans votre message. –
Je suis désolé, mais il y a tout ce qu'il y a. – ultrajohn
Je suis désolé s'il vous plaît attendre – ultrajohn