Я хорошо знаком с ASLR, но сегодня услышал новый интересный факт о реализации ASLR в Windows.
Чтобы оптимизировать производительность, если процессы A и B загружают одну и ту же DLL, Windows загрузит ее только один раз в физическую память, и оба процесса будут совместно использовать один и тот же экземпляр через общие страницы.
Это старые новости. Но самое интересное, что и процесс A, и процесс B будут загружать разделяемую библиотеку по одному и тому же виртуальному адресу (почему??).
Мне кажется, что любая локальная атака (например, повышение привилегий) может легко обойти ASLR следующим образом:
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.
Я провел несколько простых тестов с помощью Olly и обнаружил, что общие библиотеки действительно загружаются по одному и тому же виртуальному адресу.
Если это действительно так, бесполезен ли ASLR для локальной эксплуатации?