Борьба с утечками ресурсов и переполняющимися буферами


         

строка, реализованная в виде списка (продвинутая реализация)


Размер буфера может быть как фиксированным, так и динамическим. Хорошей стратег выделяет под первый элемент списка ~64 байт, под второй ~128 байт и так далее вплоть до 1000h, что позволяет обрабатывать как длинные, так и кроткие сроки с минимальным оверхидом.

Списки на 100% защищены от ошибок переполнения (исключение составляют попытки обработать строку свыше 2 Гбайт, вызывающую исчерпание свободной памяти, но, во-первых, исчерпание это все-таки не переполнение и заслать shell-код злоумышленник не сможет, а во-вторых, это _явная_ ошибка, которую легко обработать, установив предельный лимит на максимально разумную длину строки).

Хуже другое. Реализовав свою библиотеку для работы со "списочными строками", мы будем вынуждены переписать _все_ остальные библиотеки, создавая обертки для каждой строковой функции, включая fopen, CreateProcess и т. д., поскольку все они ожидают увидеть непрерывный массив байт, а вовсе не список! Это чрезвычайно утомительная работа, но зато когда она будет закончена, о переполнения можно забыть раз и навсегда. Правда, производительность (за счет постоянного преобразования типов) падает и весьма значительно…

А вот более быстрое, но менее надежное решение. Отказываемся от стековых буферов, переходя на динамическую память. Выделяем каждому блоку на одну страницу больше, чем нужно и присваиваем последней странице атрибут PAGE_NOACCESS, чтобы каждое обращение к ней вызывало исключение, отлавливаемое нашим обработчиком, который в зависимости от ситуации либо увеличивал размер буфера, либо завершал работу программы с сообщением об ошибке. На коротких строках оверхид весьма значителен, но на длинных он минимален, однако, такая защита страхует лишь от последовательного переполнения, но бессильна предотвратить индексное (подробнее о видах переполнения можно прочитать в моей книжке "shellcoders's programming uncovered", которую можно найти в Осле), к тому же переход на динамические массивы порождает проблему утечек памяти и получается так, что одно лечим, а другое калечим.



Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий