Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #45, АВГУСТ 2004 г.

Защитись и замети!

Коваленко Дмитрий aka Ingrem

Спецвыпуск Xakep, номер #045, стр. 045-068-9


0000010E: F7D1 not ecx

00000110: 81F903010000 cmp ecx,000000103

00000116: 7E07 jle 00000011F

00000118: C6820301000000 mov b,[edx][000000103],000

0000011F: 9D popfd

00000120: 61 popad

00000121: 68EA3C4500 push 000453CEA

00000126: E9F53B0500 jmp .000454720

Минздрав предупреждает: чтение толковой документации вызывает привыкание! :)

Заполняя буфер,

осторожен будь.

Пара лишних байтов –

к overflow путь!

Думать головой – главное правило программиста.

Борис, скажи дыркам нет! (почти Гоблиновский "Властелин Колец")

– А причем тут канарейки?

– А я знаю?

Автоматический контроль переполнения массивов есть и в других компиляторах С++, например, в Compaq C или cc из Alpha Linux.

Для безопасности вместо функций strcpy, gets, sprintf в программе лучше использовать их безопасные аналоги – strncpy, fgets, snprintf.

Многие разработчики не учитывают элементарных вещей, и список дырок растет с каждым днем.

К сожалению, универсального способа проверки длины данных произвольной структуры, заносимых в буфер, не существует :-(.

Зачем генерить canary word случайно? Затем что, если canary word будет какой-то жестко заданной константой, хакер сможет накодить эксплоит, в котором по заранее рассчитанному смещению будет лежать эта константа.

Впервые защита на основе canary word была реализована в проекте Synthetix в виде опции компилятора. Размер буферов при сборке корректировался автоматически, проверки встраивались в генерируемый код.

Большой плюс защиты на основе canary word в том, что она универсальна и может применяться для защиты любого буфера, где бы он ни находился. Кроме того, эта техника почти не замедляет работу программы.

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

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

Копирование двойными словами происходит намного быстрее копирования по байту.

Специально для любителей оптимизации: код патча можно уменьшить, по крайней мере, на 5 байт, если по адресу 0x00453CE5 заменить jmp на call. Как? Попробуй разобраться самостоятельно :-).

Назад на стр. 045-068-8  Содержание