вторник, 29 мая 2012 г.

Низкое

Я, конечно, слоупок во всем близком к железу и низкоуровнему сетевому. Так что пинать ногами за некомпетентность надо, а еще лучше меня просвещать разговорами на эту тему. Что не мешает первому потоку. Тонкости перехода из режима ядра и режима пользователя мне пока мало подвластны.

Как-то странно там устроено. Правда, все странности вылазят через несколько лет. Вот есть *86 процессор. Сейчас мне уже непонятно, зачем на стеке вместе с локальными переменными держать код возврата (ip aka instruction pointer). Он как-то малоотличим от локальной переменной. Шаг влево, или вправо, и все - ты вирус. Все ошибки "переполнения буфера" / перезаписи кода возврата из-за этого. Любой "безобидный" scanf или вход от внешней среды рассматривается как ящик Эболы.

Сейчас есть методы, которые переставляют параметры на стеке / добавляют пустоты в стеке. Вирусы просто так уже не пройдут, даже есть у вас есть gdb и запас маны. Перестановка при каждом запуске своя, рандомная. Хотя, если перехватить randseed...

А надо было всего-то сделать два стека. Один полностью защищенный, для кодов возврата. В другом - хочешь, можешь ломать локальные переменнные вышестоящих вызовов - твои проблемы.

Атаки на хип... а есть такие? Темный я что-то. Небольшой род многолетних травянистых растений семейств капустных его знает. Как ОС выделит память в хипе, известно даже не ей, и Богу из машины только randseed первоначальный дан. Да и что там ловить, ведь instruction pointer все равно в стеке.

Сейчас-то легко говорить. Можно еще Хоару null-ы припомнить и ничего взамен путного не предложить. Как бы видеть такие вещи лет на 30 вперед, а то Ванга какую "все тот же из семества капустных" нагадала. Не то что косяки, просто могло быть без этих шероховатостей. Хотя обжигаться об сковородку надо как минимум для иммунитета.

Комментариев нет: