Ответ 1
Чтобы ответить на ваш вопрос, нам сначала нужно определить: предотвращение выполнения данных, компиляцию Just In Time и JIT Spraying.
Предотвращение выполнения данных - это функция безопасности, которая запрещает выполнение кода из неиспользуемой области памяти. DEP может быть реализован аппаратными механизмами, такими как бит NX и/или программным механизмом, путем добавления проверок времени выполнения.
Компиляторы Just In Time (JIT) - это динамические компиляторы, которые преобразуют байтовые коды во время выполнения в машинный код. Цель состоит в том, чтобы объединить преимущества интерпретируемого кода и скорости скомпилированного кода. Он должен компилировать методы только в том случае, если дополнительное время, затрачиваемое на компиляцию, может быть амортизировано увеличением производительности, ожидаемым от скомпилированного кода. [1]
JIT-распыление - это процесс принуждения JIT-механизма для записи многих исполняемых страниц со встроенным шеллокодом.
[....]
Например, оператор Javascript, такой как "var x = 0x41414141 + 0x42424242;" может быть скомпилирован, чтобы содержать два 4 байтовых константы в исполняемом изображении (например, "mov eax, 0x41414141; mov ecx, 0x42424242; add eax, ecx" ). Запустив выполнение в середине этих констант, вы увидите совершенно другой поток команд.
[....]
Ключевым понятием является то, что JIT предсказуем и должен скопировать некоторые константы на исполняемую страницу. Учитывая единообразный оператор (например, длинную сумму или любой повторяющийся шаблон), эти константы могут кодировать небольшие команды и затем управлять потоком до следующего постоянного местоположения. [2]
Передовые методы, выходящие за рамки этого ответа, затем должны использоваться для поиска адреса блока распыления JIT и запуска эксплоита.
Теперь должно быть ясно, что
Если код злоумышленника генерируется движком JIT, он также будет находиться в исполняемой области. Другими словами, DEP не участвует в защите кода, испускаемого компилятором JIT. [3]
Ссылки
[1] Динамическая оптимизация для Java-компилятора Just-in-Time
[2] Использование интерпретатора: вывод указателя и JIT-опрыскивание