Обработка исключений QEMU

Я столкнулся с ошибкой при тестировании некоторого кода, который генерировал ошибки защиты. У меня был настроен обработчик исключений, так что он ожидал, что EIP и стек не изменятся, стандартное поведение на собственном ЦП. Но в QEMU и ESP, и EIP изменяются во время генерации ошибки.

ОС 32-битная, поэтому случай ошибки связан с выходом из сегмента CS. Копаясь в коде QEMU, кажется, что EIP и ESP устанавливаются после вызова raise_exception_error внутри helper_ret_protected. Итак, я не могу понять, почему я вижу другое поведение гостя.

Я не понимаю, как QEMU генерирует исключения, есть ли еще один шаг, который происходит после вызова методов ret_protected?


person anandb    schedule 13.04.2013    source источник


Ответы (1)


В исключительных случаях ЦП будет переключать стек при пересечении границ уровня привилегий. Таким образом, TSS содержит SS и ESP записей для каждого уровня. Если код, вызвавший сбой, находится в коде пользовательского режима, стек будет изменен. Значения SS:ESP считываются из полей ss0 и ebp0 TSS.

Я почти не уверен в том, что вы подразумеваете под «ожиданием того, что EIP не изменится».

Если бы вы могли дать более подробную информацию о своей проблеме, это могло бы помочь найти правильный ответ...

person Powerslave    schedule 14.04.2013
comment
код выделяет большой CS, а затем выполняет Ret, который выводит его за пределы CS. Это вызывает общую ошибку защиты, так как код превысил предел CS. В собственном ЦП, когда запускается GPF, EIP будет указывать на неисправную инструкцию в CS. Таким образом, в обработчике исключений вы можете получить инструкцию с ошибкой, в QEMU EIP находится вне CS и не указывает на инструкцию с ошибкой. Так понятнее? - person anandb; 15.04.2013
comment
@anandb Намного понятнее. Спасибо! В любом случае, есть ли причина, по которой вы решили не использовать плоские сегменты? Вы тестировали на голом металле? Как насчет отладки (особенно проверки стеков)? Связана ли рассматриваемая инструкция ret с переключением в PMode? - person Powerslave; 15.04.2013
comment
Кстати, если я хорошо помню, EIP в стеке исключений будет указывать не на ret, который вывел управление из CS, а скорее на фактический адрес сбоя - то есть из CS, поэтому, если я не понял вас неправильно, поведение кажется правильным. мне. - person Powerslave; 15.04.2013
comment
Разве адрес сбоя не является адресом инструкции, генерирующей ошибку в CS? - person anandb; 16.04.2013
comment
@anandb Я думаю, что это скорее адрес, по которому на самом деле происходит исключение, то есть за пределами CS - вот почему запускается исключение. если у вас есть доступ к машине с флоппи-дисководом и флоппи-диском, то это довольно просто выяснить: загрузите свой код с (плоской) дискеты и распечатайте стек на GPF. Я думаю, что он напечатает адрес за пределами CS. Извините, что не уверен, я сделал это довольно давно... - person Powerslave; 16.04.2013