Я не знаю, правильно ли вам задать вопрос, но я объясню, когда ASLR эффективен, а когда нет.
Допустим, у нас есть app.exe и TargetLib.dll.
app.exe использует (связанный с) TargetLib.dll.
Чтобы упростить объяснение, давайте предположим, что виртуальное адресное пространство имеет только эти 2 модуля.
Если оба включены ALSR, базовый адрес app.exe неизвестен. Он может разрешать некоторые адреса вызовов функций при загрузке, но злоумышленник не знает, где находится функция и где находятся разрешенные переменные. То же самое происходит при загрузке TargetLib.dll.
Несмотря на то, что app.exe имеет таблицу поиска, злоумышленник не знает, где находится таблица.
Поскольку злоумышленник не может определить содержание определенного адреса, он должен атаковать приложение, не используя никакой информации о фиксированном адресе. Обычно сложнее, если он использует обычный метод атаки, такой как переполнение стека, переполнение кучи, использование после освобождения ...
С другой стороны, если app.exe НЕ поддерживает ASLR, злоумышленнику будет проще использовать приложение. Потому что может быть вызов функции интересующего API по определенному адресу в app.exe, и злоумышленник может использовать этот адрес в качестве целевого адреса для перехода. (Атака приложения обычно начинается с перехода на произвольный адрес.).
Supplementation:
Возможно, вы уже понимаете это, но я хочу прояснить одну вещь.
Когда злоумышленник использует приложение с помощью уязвимости, такой как повреждение памяти, он обычно вынужден использовать fixed address jump instruction
. Они не могут использовать relative address jump
инструкцию для использования. Это причина, почему ALSR действительно эффективен для таких эксплойтов.