Оглавление Об учебном пособии
Использованные источники1 Использованные источники2 Использованные источники3 Использованные источники4 Использованные источники5 Использованные источники6

Поясним особенности выполнения этих команд на конкретных примерах.

Поскольку поле IOPL находится не в дескрипторе, а в более доступном регистре FLAGS, может показаться, что способ защиты ввода-вывода проработан не очень хорошо. Предположим, что прикладная программа безуспешно попыталась выполнить команду ввода-вывода. Тогда можно записать копию регистра EFLAGS в стек, преобразовать его как любой операнд в памяти, а затем извлечь из стека модифицированный образ в регистр флагов:

pushfd ; Включить флажки в стек
or dword ptr ss:[esp], 3000h ; Задать IOPL = 3
popfd ; Извлечь флажки из стека
; Теперь можно производить ввод-вывод

Однако такой прием в МП iх86 не работает из-за особенностей выполнения команд POPFD и POPF.

Примерно такая же ситуация характерна для модификации флага прерываний IF. Команды сброса CLI и установки STI этого флага являются IOPL-чувствительными. Если оказалось, что прямое их выполнение невозможно, можно попытаться аналогичным способом воздействовать на флажок IF регистра EFLAGS:

pushfd ; Включить флажки в стек
and dword ptr ss:[esp],0ffffffdffh ; Сбросить IF
popfd ; Вернуть флажки
; Прерывания запрещены

Но это тоже не проходит. Команда popfd просто не изменит ни IOPL, ни IF.

<< Назад