Защитись и замети! Коваленко Дмитрий 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. Как? Попробуй разобраться самостоятельно :-). |