OSDev http://osdev.su/ |
|
защита от LGDT, LIDT, IRET http://osdev.su/viewtopic.php?f=5&t=573 |
Страница 1 из 1 |
Автор: | scuter [ 01 июн 2012, 20:58 ] |
Заголовок сообщения: | защита от LGDT, LIDT, IRET |
как защитить код от использования этих комманд, и ещё интересно использование расширений в разных режима, по существу проблема такая, если реализуется многозадачность и по прерыванию таймера PIT реализуется выполнение задач, т.е. по очереди перебераются задачи с использованием far call и возврат к меджеру задач осуществляется командой ret, то возникают такие проблемные моменты как например использование команды IRET в этом случае менеджер задач дойдёт до программы где эта комманда используется и на этом остановится, или если будет использоваться команды LGDT, LIDT то вся многозадачность вылетает в трубу, в связи с такими обстоятельствами необходимо как то защитится от таких комманд и как вот это сделать. к тому же хотелось бы узнать что можно использовать в каком режиме. Код: +------------------+------+------+------+-----+-----+-----+-----+-----+
| | LGDT | LIDT | IRET | FPU | MMX | SSE | AVX | HMA | +------------------+------+------+------+-----+-----+-----+-----+-----+ | Real Mode | + | + | + | | | | | | +------------------+------+------+------+-----+-----+-----+-----+-----+ | Protected Mode | + | + | + | | | | | | +------------------+------+------+------+-----+-----+-----+-----+-----+ | Virtual 8086 Mode| - | - | + | | | | | | +------------------+------+------+------+-----+-----+-----+-----+-----+ |
Автор: | Bargest [ 01 июн 2012, 21:03 ] |
Заголовок сообщения: | Re: защита от LGDT, LIDT, IRET |
Ответы на все эти вопросы есть в документации. Читайте её, уже не первый раз говорю. В защищенном режиме есть 4 уровня привилегий ("кольца" с 0-го по 3-е). 3 уровень привилегий - уровень пользователя. Тут меньше всего прав. Больше всего на нулевом. Некоторые команды не доступны с 3 кольца (на котором должны работать приложения). А многозадачность обычно организуется в виде переключения по таймеру, т.е. задача по времени работает между двумя прерываниями таймера (если говорить про самые распространенные многозадачные ОС). |
Автор: | scuter [ 02 июн 2012, 00:48 ] |
Заголовок сообщения: | Re: защита от LGDT, LIDT, IRET |
Bargest писал(а): Ответы на все эти вопросы есть в документации. Читайте её, уже не первый раз говорю. В защищенном режиме есть 4 уровня привилегий ("кольца" с 0-го по 3-е). 3 уровень привилегий - уровень пользователя. Тут меньше всего прав. Больше всего на нулевом. Некоторые команды не доступны с 3 кольца (на котором должны работать приложения). А многозадачность обычно организуется в виде переключения по таймеру, т.е. задача по времени работает между двумя прерываниями таймера (если говорить про самые распространенные многозадачные ОС). ну Привилегированные команды ладно, с этим понятно, но Iret то будет работать или нет или он будет работать как обычный ret а дополнительные расширения, их можно использовать в любом режиме. |
Автор: | Станислав [ 02 июн 2012, 03:40 ] |
Заголовок сообщения: | Re: защита от LGDT, LIDT, IRET |
scuter писал(а): ну Привилегированные команды ладно, с этим понятно, но Iret то будет работать или нет или он будет работать как обычный ret а дополнительные расширения, их можно использовать в любом режиме. iret для возврата берёт ещё и флаги процессора из стека помимо адреса, так что если ты перепутаеш её с ret то сразу будет ошибка критическая. Нарушение порядка пользования стеком всегда приводит к ошибке критической Цитата: или если будет использоваться команды LGDT, LIDT то вся многозадачность вылетает в трубу LGDT, LIDT и многозадачность ни как не связаны Вообще многозадачность это массив с задачами(программами), которые работают одновременно, так можно на это посмотреть. Но это только кажется что работают одновременно, из за того, что процессор за секунду может выполнить много задач и нам кажется, что они выполнены одновременно. Если даже выполняется одна задача долгое время, то её прерывают, например постоянными срабатываниями прерываний(от сюда и название), прерывание записывает адрес задачи и флаги процессора в стек и запускает обработчик адрес которой записан в LIDT, в обработчике находится обычная функция, которая выполняется и выходят из неё iret Кстати после вызова функции командой call в стеке только адресс и после её завершения результат её работы можно сохранить в флагах процессора Например в момент выполнения какой то функции сработает прерывание от мыши, то та функция прервётся и нарисуется на экране курсор в новой координате, или от веб камеры картинка придёт на экран, и т.д. Прерывают постоянно все устройства, но пользователю этого не заметно FPU это вообще мат сопроцессор с которым проц очень связан и для него есть свои команды, например если захочеш посчитать числа с плавающей точкой то придётся пользоваться им, так как сам процессор не делает этого. От режима процессора он не зависит |
Автор: | grindars [ 02 июн 2012, 09:16 ] |
Заголовок сообщения: | Re: защита от LGDT, LIDT, IRET |
В общем случае, многозадачные системы работают так. Я опишу программное переключение задач; по моему мнению, оно позволяет лучше понять сам процесс, да и это единственный вариант в 64-битном режиме. Задачи работают в третьем кольце защиты (в CS дескриптор с CPL 3). Когда наступает прерывание - неважно, аппаратное или программное, инструкцией int - процесс находит в IDT дескриптор, соответствующий вектору. Дальше я буду исходить из того, что был найден interrupt gate - trap gate отличается только тем, что не запрещает прерывания, а остальные используются редко. Процессор берет из дескриптора адрес обработчика (селектор и адрес, CS:EIP) и смотрит, произошло ли переключение уровня привилегий. Если да, то процессор меняет стек (SS:ESP) на тот, что указан в SS для нового уровня привилегий (т.е., обычно, SS0:ESP0) и сохраняет в него (обычным push) прошлое значение SS и ESP. Затем, независимо от того, был ли сменен уровень, процессор сохраняет прошлое значение EFLAGS, CS и EIP в стек. Некоторые исключения (вроде GP и PF) сохраняют в стек еще в этот момент код ошибки. Затем процессор загружает новый CS и переходит к выполнению обработчика прерывания, предварительно запретив прерывания. Обработчик прерывания выполняется уже на нулевом (обычно) уровне привилегий и может использовать все инструкции. Первое, что он делает - выталкивает код ошибки, если он есть, сохраняет в стек все остальные регистры (сегментные кроме CS и SS, все РОНы), а затем разбирается с тем, что делать. В системах с вытесняющей многозадачностью, например, прерывание от таймера выбирает следующую готовую к выполнению задачу. Если в результате выполнения обработчика возникла необходимость переключить задачу, то состояние регистров (и запихнутых самим процессором, и сохраненных в начале обработчичка) копируется в служебную структуру в памяти ядра (контекст задачи), а затем на его место в стеке копируется контекст новой задачи. Выход из обработчика выполняется одинаково независимо от того, было переключение или нет. Обработчик прерывания выталкивает все сохраненные им регистры, а затем вызывает iret. Iret выталкивает EIP, CS, EFLAGS и смотрит, отличается ли уровень привилегий нового CS от старого. Если да, то процессор вытаскивает новые значения регистров ESP и SS из стека. После этого он передает выполнение прерванному коду. Таким образом, для задач факт переключения задачи невидим - с их точки зрения, они выполняются параллельно. |
Автор: | phantom-84 [ 02 июн 2012, 10:14 ] |
Заголовок сообщения: | Re: защита от LGDT, LIDT, IRET |
grindars писал(а): Если в результате выполнения обработчика возникла необходимость переключить задачу, то состояние регистров (и запихнутых самим процессором, и сохраненных в начале обработчичка) копируется в служебную структуру в памяти ядра (контекст задачи), а затем на его место в стеке копируется контекст новой задачи. А зачем дублировать сохраненные "в начале обработчика" регистры? DS, ES и все РОНы я сохраняю еще "в начале обработчика", FS, GS и EIP в подпрограмме переключения (причем EIP неявно - это делает call, вызывающий подпрограмму). В структуре потока сохраняется только ESP, все остальное, получается, - в ядерном стеке потока.grindars писал(а): Если да - сохраняет текущие SS:ESP на нужное место в TSS (обычно - SS0:ESP0) и вытаскивает их новые значения из стека. После этого ппроцессор передает выполнение прерванному коду. Это неправда. Данные поля TSS статичные, т.е. они могут быть изменены только программным путем.
|
Автор: | grindars [ 02 июн 2012, 10:17 ] |
Заголовок сообщения: | Re: защита от LGDT, LIDT, IRET |
phantom-84 писал(а): Это неправда. Данные поля TSS статичные, т.е. они могут быть изменены только программным путем. А, да? Тогда исправлю. У меня состояние указателя стека всегда возвращалось к исходному, поэтому не заметил ошибку. |
Автор: | phantom-84 [ 02 июн 2012, 10:36 ] |
Заголовок сообщения: | Re: защита от LGDT, LIDT, IRET |
scuter писал(а): но Iret то будет работать или нет При обычном возврате (не при выходе из вложенной задачи) iret может только понижать привилегии. При попытке их повысить будет генерироваться исключение.
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |