Pull to refresh

Comments 22

А как это можно было исправить на уровне ОС если код мог быть создан динамически?

Исправлялась обработка исключения по неправильной инструкции (настройкой таблиц прерываний), чтобы процессор не зависал. На вики описано (раздел Workarounds).

Так ведь там в том то и суть бага, что до обработки исключения дело не доходило.

А вы вики читали? Таблицы настраиваются так, чтобы при зачитывании адреса обработчика invalid instruction происходил page fault - и он тогда обрабатывается без блокировки шины и зависания, дальше уже в обработчике page fault детектируем, что на самом деле был invalid instruction и обрабатывем соответственно.

Спасибо за информацию.

Зачем сложности с установкой C++, если debug.exe включен в состав ОС?

Ага, только сейчас дошло. Можно было так же исполнить эти четыре байта и посмотреть, что будет.

Скорее всего будет обычное исключение по неправильной инструкции. debug работает в 16битном режиме, там у этих байтов другой смысл.

В принципе можно сделать копию какого нибудь 32битного EXEшника и тем же debug.exe поменять первые инструкции на f0 0f ... - только надо ещё разобраться, где в файле лежит первая исполняемая инструкция.

Могу попробовать.

Тут ради интереса ещё запустил на x86Box:

Не получилось. Хотя стоит та же Win98, что и на пеньке (я с одного и того же образа ставил).

Можете баг репорт на эмулятор закинуть - поведение отличается от реального железа )

Закинул. Ответили, что сомневаются в возможности это реализовать.

P5 -- не архитектура, а микроархитектура. Ну а архитектура у Пентиумов та же самая, что и у 80386, 486, Пентиумов-2-3-4 и Коре, и официально она называется IA-32.

Здесь про другой дефект, менее известный, но не менее впечатляющий.

он же 16битный, не прокатит, как и debug.exe

я помню под дос, 486, создавал текстовой файл, переименовывал в .com. если там было пусто, комп перезагружался, если туда вписать мусор, то зависал намертво.

Мне кажется, что наглядности не хватает. Было бы эффектнее, если бы завесили NT4 SP2, но не завесили NT4 SP6a, а после применения мер против виндового статического патчера, борющегося с"F00F", завесили и NT4 SP6a.

Для NT4 32 MB RAM - объём, не заставляющий страдать от свопинга.

Или, для демонстрации серьёзности ситуации: завесить сервер непривилегированным юзером. В частности терминальный, nt4 tse.

Что-то в статье какая-то каша и без дополнительного гугления ничего не понятно.

Сама по себе эта инструкция использовалась для сравнения значения данных в регистре с 8 байтами в памяти, а при неправильном её использовании процессор просто бы выдал исключение.

А чем правильное использование инструкции отличается от неправильного?

На самом деле эта инструкция неправильна в принципе, и при её использовании процессор всегда выдаёт исключение Invalid Opcode. И в этом исключении и проблема - префикс lock некорректно работает когда команда выдаёт исключение Invalid Opcode.

Сначала программно, путём создания различных патчей для ОС, не дававших выполнить эту инструкцию и повесить ПК

Как вообще можно на уровне ОС не давать выполнять непривилегированную инструкцию?

Спасибо @unreal_undead2 что объяснил выше. Разумеется, никакого запрета не было, вместо этого путём манипуляций с таблицами дескрипторов исключение Invalid Opcode заменялось на Page Fault. Видимо, Page Fault был отлажен лучше и не приводил к зависанию.

Sign up to leave a comment.

Information

Website
timeweb.cloud
Registered
Founded
Employees
201–500 employees
Location
Россия
Representative
Timeweb Cloud