Рассмотрим архитектурную меру безопасности, предназначенную для предотвращения атак переполнения буфера стека, когда вместо сохранения адреса возврата в стеке ЦП сохраняет разницу между указателем стека и адресом возврата. В частности, инструкции call и ret теперь ведут себя следующим образом:
- call: Пусть n будет адресом следующей инструкции.Вместо того, чтобы поместить n в стек, инструкция call помещает (n – esp), где esp — указатель стека, а n — адрес следующего
инструкция после инструкции вызова.
- ret: вместо извлечения n из стека и перехода к n, инструкция ret извлекает x и переходит к (esp + x).
Усложняет ли предлагаемая мера эксплуатацию переполнения буфера стека при следующих 4 условиях? Какова вероятность успеха одной попытки эксплуатации для этих 4? (например, 1, 2^-16 2^-24 2^-40)
- Без ASLR или DEP/W™X
- Без ASLR, с DEP/W™X
- С ASLR, без DEP/W™X
- С ASLR и DEP/W™X
Мы можем предположить, что либо отображаемая область, либо текстовый сегмент содержат достаточно ROP-гаджетов для реализации вашего шелл-кода.
Кроме того, реализация ALSR представляет собой 32-битный PaX ASLR, в котором база стека рандомизирована на 24 бита и выровнена по границе 16 байт, адрес области отображения имеет рандомизированные 16 бит и выровнен на границе 4096 байт, а адрес области, содержащей код, статические переменные и кучу, состоит из 16 рандомизированных битов и выровнен по границе 4096 байтов, как показано ниже.