2017-08-06 3 views
3

Ce n'est pas vraiment un problème pour moi mais j'ai juste commencé à y penser et j'ai pensé que je demanderais. Pourquoi cela retournerait-il des valeurs différentes chaque fois que j'exécuterais le programme (0x3759F8B0 - 0x100)?Pourquoi cela renvoie-t-il des valeurs différentes chaque fois que j'exécute le programme? 0x3759F8B0 - 0x100

Une fois il dit 00AFFD00 et la suivante, il dit 006FFD48

test = 0x3759F8B0 - 0x100; 
cout << &test << endl; 
+5

Vous envoyez l'adresse de la variable 'test', et non sa valeur. – pat

+0

Quelle est la base de votre expecation qui devrait toujours produire la même valeur? – EJP

Répondre

8

Je suppose que votre source de programme complet se lit comme

#include <iostream> 
using namespace std; 
int main() 
{ 
    int test; 
    test = 0x3759F8B0 - 0x100; 
    cout << &test << endl; 
} 

Comme @pat déjà mentionné dans le commentaire, votre programme émet le adresse de la variable test, et non sa valeur. Sur les systèmes d'exploitation modernes, il existe quelque chose appelé «randomisation de la disposition de l'espace d'adressage» (ASLR, voir https://en.wikipedia.org/wiki/Address_space_layout_randomization pour une bonne vue d'ensemble) qui aide à exploiter les vulnérabilités de sécurité pouvant exister dans un programme. L'idée est, qu'à chaque nouveau démarrage d'un programme, les adresses des choses qu'il utilise sont randomisées. Par conséquent, l'adresse des variables changera à chaque lancement avec ASLR activé. ASLR est maintenant une fonctionnalité standard dans les systèmes d'exploitation grand public. Cependant, il peut être désactivé (non recommandé) et sans ASLR, le programme ci-dessus émettrait toujours la même sortie.

+0

Vous l'avez cloué datenwolf! Je me suis posé cette question tellement de fois - j'ai appris quelque chose de nouveau aujourd'hui de la randomisation mise en page de l'espace d'adresse étonnante – nitinr708