Question

De Article Microsoft:

Randomisation de la disposition de l'espace d'adressage (ASLR)

ASLR déplace les images exécutables vers des emplacements aléatoires lorsqu'un système bottes, ce qui rend plus difficile pour exploiter code pour fonctionner de manière prévisible. Pour un composant pour soutenir ASLR, tous composants qu'il charge doivent également soutenir l'ASLR. Par exemple, si A.exe consomme B.dll et C.dll, les trois doit supporter l'ASLR. Par défaut, Windows Vista et plus tard va randomiser le système DLL et EXE, mais DLL et EXE créés par les ISVs doivent opter pour soutenir ASLR utilisant le linker /DYNAMICBASE l'option.

Je ne comprends pas très bien.Prenez les DLL du système de base chargées par chaque processus sous WIndows : NtDll.dll et kernel32.dll.

Si j'ai un pas au courant exécutable, ces DLL système utiliseront-elles ASLR ?Autrement dit, se chargeront-ils à une adresse de base différente après chaque redémarrage du système sur Win 7 pour cet exécutable ou se chargeront-ils toujours à la même adresse de base après le redémarrage du système comme ils le font sur Win XP ?

Pour que ce soit plus clair ce que je veux dire : La pile de démarrage de mon programme factice typique ressemblera à ceci :

    write_cons.exe!wmain()  Line 8  C++
    write_cons.exe!__tmainCRTStartup()  Line 583 + 0x19 bytes   C
    write_cons.exe!wmainCRTStartup()  Line 403  C
>   kernel32.dll!_BaseProcessStart@4()  + 0x23 bytes    

En regardant l'asme de BaseProcessStart, je vois sur ma boite XP ici :

_BaseProcessStart@4:
7C817054  push        0Ch  
7C817056  push        7C817080h 
7C81705B  call        __SEH_prolog (7C8024D6h) 
7C817060  and         dword ptr [ebp-4],0 
...

Maintenant, ce qui m'intéresse est le suivant :

Sous Windows XP, l'adresse sera toujours être 0x7C817054, quel que soit le nombre de fois que je redémarre cette machine.Si j'étais sur Win7 avec ASLR, cette adresse va-t-elle changer entre les redémarrages si l'exécutable qui charge kernel32.dll est pas activé pour ASLR ?

(Note:Pour moi, atm., il n'y a qu'un seul cas d'utilisation mineur pour lequel cette adresse serait utile :Dans Visual Studio, je ne peux définir qu'un "point d'arrêt de données" pour les fonctions de niveau assembly, c'est-à-dire un point d'arrêt @ 0x7...- Si je souhaite interrompre une fonction ntdll.dll ou kernel32.dll spécifique, sous Windows XP, je n'ai pas besoin d'ajuster mes points d'arrêt entre les redémarrages.Avec l'entrée en vigueur d'ASLR (la portée de cette question), je devrais modifier les points d'arrêt de données entre les redémarrages.)

Était-ce utile?

La solution

Techniquement, que les DLL système soient déplacées ou non, cela ne devrait pas avoir d'importance, car l'éditeur de liens se liera aux symboles et non aux adresses.Ces symboles sont résolus par le chargeur d'exécution en adresses pour les DLL système instanciées, donc votre binaire ne devrait pas en être plus sage.D'après ce que j'ai vu cependant, Windows 7 réinitialisera la randomisation de base à chaque redémarrage, y compris les DLL système (remarque :cela provient du débogage des applications WOW64 sur le serveur Widows 2008 R2).Vous pouvez également désactiver l'ASLR à l'échelle du système via certaines modifications du registre, mais ce n'est pas vraiment pertinent...

Mise à jour:

la section sur l'ASLR dans ce L'article explique ce qui est déplacé et quand.il ne précise pas si la base sera réinitialisée à chaque redémarrage, mais pour les DLL système, il ne sera jamais garanti de se charger deux fois à la même adresse, de redémarrer ou de ne pas redémarrer.l'important est que, selon l'article, tout doit adhérer à ASLR pour que les DLL système soient déplacées.

Autres conseils

Votre programme résoudra les appels dans les DLL système partout où elles sont chargées.Mais, à moins que votre exécutable ne soit lié à /DYNAMICBASE, il ne recevra pas d'adresse de base aléatoire.En d’autres termes, votre exe se chargera toujours à la même adresse de base.

Si vous souhaitez que votre exe se charge à une adresse aléatoire, vous devez le lier à /DYNAMICBASE, et chaque DLL référencée doit également avoir été liée à /DYANMICBASE.Les DLL système (à partir de Vista) sont toutes liées à /DYNAMICBASE.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top