Je suis assez familier avec ASLR, mais aujourd'hui j'ai entendu un nouveau fait intéressant sur l'implémentation de ASLR dans Windows.Contourner Windows ASLR en déterminant l'adresse de la bibliothèque en utilisant des pages partagées
Afin d'optimiser les performances si les processus A et B charge la même DLL Windows ne le chargera qu'une seule fois en mémoire physique et les deux processus partageront la même instance via des pages partagées.
Ceci est une vieille information .. Mais la partie intéressante est que les deux processus A et B vont charger la bibliothèque partagée dans la même adresse virtuelle (pourquoi ??).
Il me semble que toute attaque locale (par exemple une escalade de privilège) peut facilement contourner ASLR par la manière suivante:
1. Create a new dummy process
2. Check the address of dlls of interest (kernel32, user32 ..)
3. Attack the privileged process and bypass ASLR with the information from step 2.
Je l'ai fait quelques tests simples à l'aide Olly et a constaté que les bibliothèques partagées sont bien chargées dans la même adresse virtuelle.
Si c'est vraiment le cas, l'ASLR est-il inutile pour l'exploitation locale?
Si la DLL serait chargée à une adresse différente, alors il doit être déplacé et les pages de RAM ne peuvent plus être partagés. Le point majeur de ASLR est que lorsqu'il est chargé sur votre machine n'est pas le même que celui où il est chargé sur le mien. Et quand vous redémarrerez, ce sera différent aussi. –
Autant que je me souvienne .. Chaque processus a une table qui traduit les adresses de pages virtuelles en pages physiques. Chaque processus a sa propre table. Microsoft ne peut-il pas charger la DLL une fois dans le RAM physique et pour chaque processus charger la DLL dans une adresse virtuelle différente? – Michael
Non, la relocalisation modifie le code afin qu'une copie ne soit plus valide. –