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

кандидата технических наук
Терешкин, Александр Васильевич
город
Таганрог
год
2007
специальность ВАК РФ
05.13.19
Диссертация по информатике, вычислительной технике и управлению на тему «Разработка и исследование метода защиты от удаленных атак на основе диверсификации программного обеспечения»

Автореферат диссертации по теме "Разработка и исследование метода защиты от удаленных атак на основе диверсификации программного обеспечения"

На правах рукописи

Терёшкин Александр Васильевич

РАЗРАБОТКА И ИССЛЕДОВАНИЕ МЕТОДА ЗАЩИТЫ ОТ УДАЛЕННЫХ АТАК НА ОСНОВЕ ДИВЕРСИФИКАЦИИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

05 13 19 - Методы и системы защиты информации, информационная безопасность

АВТОРЕФЕРАТ

диссертации на соискание ученой степени кандидата технических наук

003065375

Таганрог 2007

003065375

Работа выполнена в Технологическом институте Южного федерального университета в г Таганроге на кафедре «Безопасность информационных технологий»

НАУЧНЫЙ РУКОВОДИТЕЛЬ.

доктор технических наук, профессор Макаревич Олег Борисович

ОФИЦИАЛЬНЫЕ ОППОНЕНТЫ-

доктор технических наук, профессор Кравченко П П (г Таганрог)

кандидат технических наук, старший научный сотрудник Пальчун Б П (г Москва)

ВЕДУЩАЯ ОРГАНИЗАЦИЯ

ФГУП «Концерн «Системпром» (г Москва)

Защита диссертации состоится «28» сентября 2007 г в 14 20 часов на заседании диссертационного совета ДМ 212 208 25 при Южном федеральном университете по адресу 347928, Ростовская область, г Таганрог, пер Некрасовский, 44, ауд И-425

Отзывы на автореферат просьба направлять по адресу 347928, Ростовская область, г Таганрог, пер. Некрасовский, 44, Технологический институт Южного федерального университета в г Таганроге, Ученому секретарю диссертационного совета ДМ 212 208 25 Галуеву Г А

С диссертацией можно ознакомиться в Зональной научной библиотеке ЮФУ по адресу 344007, Ростовская область, г Ростов-на-Дону, ул Пушкинская, 148

Автореферат разослан «27» августа 2007 г

Ученый секретарь диссертационного совета, доктор технических наук,

профессор

Галуев Г А

ОБЩАЯ ХАРАКТЕРИСТИКА РАБОТЫ

Актуальность.

Теория компиляции начала разрабатываться и -приобрела законченный вид задолго до того времени, когда необходимость защиты информации дала о себе знать. Возможно, поэтому разработчики компиляторов неохотно модифицируют языки и компиляторы для них, руководствуясь идеями экспертов защиты информации К примеру, широко известная особенность языков С и С++, позволяющая адресовать элементы массива, находящихся за последним объявленным его элементом, требует от программиста особенного внимания при разработке программного обеспечения Уязвимости в программах (в частности, сетевых), связанных именно с подобного рода ошибками, до сих пор являются самыми распространенными, причем пояснения для написания корректного кода существуют с 1989 года Лишь относительно недавно появились «надстройки» над компиляторами для автоматического контроля ошибочного кода, причем только для времени исполнения. Ни один разработчик компиляторов языка С/С++ не расширил функциональность языка, добавив в нее проверки диапазонов памяти, к которым возможно обращение генерируемого кода.

Большинство существующих эксплоитов для успешной работы требуют предварительного указания некоторых характеристик, специфичных для атакуемой программной среды - к примеру, эксплоиты переполнения локальных буферов и кучи обычно привязываются к целевой системе путем указания в них фиксированного адреса определенной инструкции, передающей управления на шеллкод, либо требуют точного указания размера переполняемого буфера. В обоих приведенных случаях для проведения успешной атаки атакующий должен иметь точную информацию о параметрах целевой системы Существующие в настоящее время методы защиты от удаленных атак не предусматривают никакую модификацию защищаемого дистрибутива на машине конечного пользователя, тем самым, позволяя атакующему использовать факт абсолютной идентичности всех дистрибутивов атакуемого ПО При наличии информации об уязвимости, присутствующей в ПО целевой машины, успешность атаки напрямую зависит от возможности обойти установленные механизмы защиты - иначе говоря, для успешной эксплуатации необходима информация об уязвимости целевого ПО и об уязвимости используемой системы защиты Использование методов модификации исполнимых файлов дистрибутивов без изменения их функциональности, делающих популяцию дистрибутивов на машинах пользователей разнородной (то есть диверсифицированной), позволяет скрыть информацию, необходимую для подготовки эксплоита, что позволяет обезопасить защищаемую систему от удаленных атак, эксплуатирующих неизвестные ранее уязвимости захвата управления

Таким образом, задача разработки методов защиты от удаленной эксплуатации уязвимостей, диверсифицирующих популяцию дистрибутивов определенного ПО, требует проведения интенсивных исследований и является актуальной

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

Для достижения указанной цели необходимо решить следующие задачи

1 Разработать алгоритмы анализа (декомпиляции) ПО с закрытым исходным кодом для последующей модификации

2 Разработать алгоритмы модификации исполнимого кода, позволяющие

защищать ПО с закрытым исходным кодом от атак, использующих

\

фиксированные адреса и фиксированные размеры

локальных буферов, с целью захвата управления

3 Выполнить обоснование возможности использования диверсифицирующих преобразований с целью защиты от атак, направленных на захват управления

4 Разработать алгоритмы рекомпиляции ПО с закрытым кодом, позволяющие интегрировать дополнительный функционал в исполнимый файл с сохранением оригинального функционала.

5 Провести экспериментальное исследование различных алгоритмов нефункциональных преобразований и установить, являются ли они диверсифицирующими в соответствии с разработанными критериями качества диверсифицирующих нефункциональных преобразований

Методы исследования основаны на использовании теории нефункциональных преобразований, теории компиляции и теории вероятностей Основные результаты, выносимые на защиту: >

1 Метод диверсификации ПО с закрытым исходным кодом

2 Алгоритмы диверсификации исполнимого кода

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

встраивание пассивных алгоритмов защиты путем его рекомпиляции 4 Результаты экспериментального исследования предлагаемого метода Научная новизна работы заключается в следующем

1 Разработан новый метод диверсификации исполнимого кода ПО

2 Разработаны теоретические основы диверсификации ПО Даны определения

запутывающим и диверсифицирующим нефункциональным преобразованиям (НФП) Доказано, что НФП обладают рядом свойств, делающих возможным создание алгоритма, осуществляющего диверсификацию кода ПО

3 Разработаны алгоритмы модификации исполнимого кода ПО, позволяющие

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

4 Разработаны алгоритмы анализа (декомпиляции) исполнимого кода в

промежуточный код, которые обеспечивают применение алгоритмов модификации ПО

5 Разработаны алгоритмы рекомпиляции исполнимого кода из промежуточного кода,

позволяющие изменять (в т ч добавлять) функционал в исполнимые файлы без нарушения их работоспособности Практическая ценность работы.

Практическая значимость результатов диссертации заключается в следующем-

1 Разработанный метод диверсификации позволяет осуществить разнородность

популяций ПО с целью защиты от удаленных атак захвата управления

2 Разработанный метод диверсификации ПО с закрытым исходным кодом может

быть использован для защиты проприетарного ПО в системе конечного пользователя

Использование результатов. Алгоритмы анализа и модификации исполнимого кода, являющиеся одним из основных результатов работы, были использованы ЗАО «РНТ» (г Москва) при выполнении научно-исследовательской работы «Плеер»

Достоверность полученных результатов подтверждается полнотой и корректностью теоретических обоснований и результатами экспериментов, проведенных с помощью разработанныхг'в диссертации программ

Апробация работы. По теме диссертации опубликовано 10 научных статей и тезисов докладов Основные результаты, полученные в ходе работы над диссертацией, были представлены на

1 Всероссийской научной конференции студентов и аспирантов «Информационные технологии, системный анализ и управление», Таганрог (2003 г )

2 Международной научно-практической конференции «Информационная безопасность», Таганрог (2004,2005,2006 г.).

3 Международной научно-практической конференции «Black Hat», Лас-Вегас, США (2006 г)

Публикации. По теме диссертации опубликовано 10 научных статей и тезисов докладов, из них две статьи опубликованы в журнале «Известия Таганрогского государственного радиотехнического университета (ТРТУ)» за 2006 г из перечня, рекомендованного ВАК РФ для публикации результатов диссертационных работ

Объем и структура диссертации. Диссертация состоит из введения, пяти глав, заключения, списка литературы, включающего 81 наименование, двух приложений Основной текст диссертации изложен на 129 страницах, включая 7 рисунков и 13 таблиц

СОДЕРЖАНИЕ РАБОТЫ

Во введении кратко рассматривается актуальность работы, цели и основные задачи, научная новизна и практическая ценность работы, приводится визуальная карта всей работы.

В первой главе определяются основные понятия, относящиеся к теме работы, и приводится перечень существующих методов защиты программных продуктов от удаленных атак Приведенный перечень охватывает как наиболее значимые методы защиты от атак в исторической перспективе, так и методы, используемые в механизмах защиты Windows ХР, Service Pack 2 и Windows 2003, Service Pack 1 Проведен сравнительный анализ представленных методов. Приводятся общие подходы к защите, используемые третьими сторонами, и рассматриваются возможные направления будущих разработок

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

Назовем архитектурой A(I, S) множество инструкций I = {ij, /2,... 1М }, каждая из которых является функцией /( : S —> SJ, где

S = {(v',v\. У) V1 eW„v2 eW2, v* еРГ„} = ЩхГГ2х *WN

является пространством векторов, состоящим из всех возможных значений

размерностей V ,V ,...,V ,и s; es является областью значений отображения /(

Входным контекстом Sf назовем множество векторов, состоящих из значений всех размерностей, оказывающих влияние на функцию 1

S, = {х* такое, что У=Щ, если3v,=v2 (/(v,)* # f(v2)': v /(Vl)' *vj),

иначе V,={a}},

где символ ОС является фиксированным элементом, не

принадлежащим множествам Щ,Ж2WN , обозначающим, что данная размерность не оказывает влияния на функцию.

Выходным контекстом назовем множество векторов, состоящих из значений всех размерностей, изменяемых функцией /

30=(хыК> такое, что V, =Щ, если Зу,,у2 е8:(/(>,) = у2 л у,'

иначе V, ={«}},

Назовем программой Р инструкцию или последовательность (инструкция, программа) или последовательность (программа, инструкция)

Р = 1 V /ЦР V Р\\1

Объединением контекстов и 52 назовем множество векторов, состоящих из

элементов векторов пространств ^ и 5"2, не являющимися ОС в каком-либо из данных пространств Запишем определение в следующей форме

5, Щ) 52 = {х^Г„ такое, что Г,=Щ, если Уу, е5,,у2 е 52.(у| е 1У1 V у'геЖ,%

иначе V, = {а}}

Аналогичным образом определим пересечение контекстов 5) и Б2 Пересечением

контекстов ^ и является множество векторов, состоящих из элементов векторов

пространств ^ и £2, не являющихся ОС ни в одном из данных пространств. Обозначим Пересечение контекстов следующим выражением

такое,что ^ еслиУу, е5„у2 л у2е^),

иначе V, = {а}}

Определим отношение включения через пересечение контекстов Контекст 51, включается в контекст 5*2 , если все элементы его векторов, не являющиеся (X в , также не являются СИ в 5"2

С Б2 О $ И = ^

Разностью контекстов и назовем множество векторов, состоящих только из

тех элементов векторов пространства , которые являются ОС в 5"2 Запишем определение в следующем виде

^ ©52 = (х- Уг, такое, что V, = , если Уу, е 5,,у2 е¿>2 (у,' Фа л у2 = а),

иначе V, = {а} }

С помощью вышеприведенных определений доказывается,, что при Р = /, | /2 ,

входных контекстах , 5"/2 и выходных контекстах , входной контекст

программы Р может быть вычислен по формуле

= (SnQSm)msn

При тех же условиях, если выполняется

VIе{1,2, ,Л^}-ЗУ1,У2 68:((/1(У1) = У2 V /2(У,) = У2) А

=>Зу3,У4 (Р(У3Х=У4 л-^*^), то выходной контекст программы Р 80р вычисляется по формуле

иначе (в общем случае)

$ор ~ $01 ^ $02

S0P <Ш S0l 1Ш s02

Для удобства иллюстрации определения понятия обратимых и необратимых инструкций на инструкциях архитектуры х86 их следует разделить на следующие группы Операции

- арифметические,

- логические,

- сдвиги и повороты,

- копирование данных,

- операции с битами и битовыми полями Ветвления

- безусловные,

- условные,

- с/без указания точки возврата — -Специальные

- изменение состояния исполнения (сигналы reset, halt),

- инструкции ввода/вывода

Назовем инструкцию обратимой, если существует программа Р; такая, что

/(v,) = v2 обратима <=> ЭР,: Vv0 е S0 3v7 е S{ Р, (vG) = v7,

где Sj является входным контекстом операции I и выходным контекстом Р1, a S0

является выходным контекстом I и входным контекстом Р{

Инструкция является необратимой, если она не является обратимой Отсюда, инструкции ветвления и специальные инструкции х86 не являются обратимыми по определению, также, не все операции х86 обратимы Разделим операции х86 по признаку обратимости Следует отметить, что обратимость некоторых инструкций х86 зависит от их контекста.

Обратимые операции

- арифметические (умножение и деление - при определенных условиях),

- логические хог, not,

- повороты,

- обмен значениями (xchg) Необратимые операции

- сложение с переносом,

- копирование (исключая обмен значениями),

- логические and, or,

- сдвиги

Понятие обратимости может быть применено и к последовательности инструкций В некоторых частных случаях последовательность необратимых инструкций может быть обратима, понятие обратимых последовательностей инструкций является более общим, чем понятие обратимой инструкции На практике же подобные обратимые последовательности встречаются редко. Таким образом, для определения практического алгоритма преобразования программ достаточно подразумевать под обратимой последовательностью инструкций последовательность обратимых инструкций

Программа Рх эквивалентна программе Р2 во входном контексте , выходном контексте Б0 , если обе программы одинаково отображают все не- ОС размерности на

все не- ОС размерности Запишем определение формально

Пусть

J = {x:3vx е^:** Фа}, К^{х:3\х&80:\х Фа)

Р\ эквивалентна программе Р2 во входном контексте 31, выходном контексте <50, если

\/v{,v2eS:(УJeJ:v{=vJ2 о V*еК:/>(▼,)* = Р2(\2)к)

Обозначим отношение эквивалентности в символическом виде

Рх^Р2{у,) = Х0

Пользуясь вышеприведенными определениями, дадим определение нефункционального преобразования

Нефункциональным преобразованием (НФП) Т является такое изменение программы Р(х) = V' в программу г(/>), для которого существует программа Р', восстанавливающая исходный выходной контекст программы Р, такая, что программа Т(Р) || Р эквивалентна программе Р во входном контексте 5 и выходном Б Формально,

Г(Р)(у) = Уг-НФП Р(у) = о (ЗР'(^г) = у' Л Г(Р)||Р' = Р(У) = У')

Разделение преобразованной программы на две части (т(Р) и Р') позволяет применять обратимые преобразования как составные части НФП Определение, основанное на эквивалентности Р и г(Р), будет менее практичным, потому что оно может описывать лишь дополнения контекстов 2"(Р) по сравнению с контекстами Р

Требование эквивалентности т(Р) || Р', = Р(у ) — заключает в себе требование сохранения отображения не- ОС размерностей программами т(Р)(у) = V и Р(\т ) = V' Это гарантирует, что если т(Р) || Р(у,) = \2, то 8 С= , 5" С 52 и Т(Р)\\Р(У) = У'

' Мощность НФП - понятие, позволяющее определить качество НФП в выбранных критериях мер сложности

Для набора мер сложности Е = {Et (Р), / = [1,... N] }, мощностью П НФП Т

программы Р назовем следующее выражение*

еК Е,(Р)

НФП X программы Р является запутывающим для выбранного набора мер

сложности Е, если его мощность П£ (г, Р) » О

Существует множество мер сложности преобразований программ, большинство из которых было выведено для частных задач Для оценки практического эффекта запутывающего преобразования удобно использовать три меры количество инструкций и аргументов, количество вложенных условий и количество адресаций локальных переменных

Для определения диверсифицирующего преобразования, как преобразования, меняющего реализацию программы без оказания явного негативного влияния на скорость ее исполнения, необходимо ввести понятие временной цены НФП

Для набора входных данных D = {dl £ S, / = [1,... iVJ}, временной ценой С

НФП Т программы Р назовем следующее выражение

t(P(dt)) '

где i(P(i/)) - время исполнения программы Р на входных данных d Таким образом, строгое определение диверсифицирующего преобразования (ДП) звучит следующим образом

Запутывающее нефункциональное преобразование д программы Р для набора входных данных D называется диверсифицирующим, если его временная цена

CD(S,P)~ 1

Опишем четыре базовых алгоритма НФП на примере преобразования программы

P = PJP2

Вставка дополнительных инструкций

Р = Р1\\Р2^г{Р)=Рх\\Р,\\Р2 S, ГШ S,, (П1 S!fJ * {а} Л 3P-'(v/0) = v„ Данное условие, накладываемое на контексты Р1, описывает ситуацию изменения

использованной части контекста обратимым преобразованием Т , определяя ее, тем самым, как действительную НФП

Изменение фрагмента программы Р

P = i>||P2=^r(P) = Pc||P2

при следующих условиях, накладываемых на Pl (v) = Vj и Рс (\с ) = V3 S И Sc = S a Sl(ftS3=Sl л Pc = i>(v) = v,

Перестановка инструкций программы P

Р = Р{\\Р2^т{Р) = Рг\\Рх при следующих условиях

0Р?(у) = у, Л

Перестановка произвольных блоков программы Р

и,

где

ветвления, позволяющие сохранить оригинальный порядок

А -

'1' 2' исполнения Р1 и Р2

Третья глава посвящена разработке метода диверсификации кода, обеспечивающего разнородность результирующего кода, транслированного с одних и тех же конструкций нефункциональных преобразований В ней дается описание диверсифицирующего генератсуза кода (ДГК) - те генератора исполнимого кода, осуществляющего диверсифицирующие преобразования над переданным ему байткодом, согласно правилам, выведенным во второй главе__

Входной исполнимый файл

Декомпилятор исполнимого кода в байткод Ги^-хЛат

ДГК, действующий согласно правилам диверсифицирующих преобразований

Диверсифицированный исполнимый файл

Рисунок 1 — схема процесса диверсификации ПО

Процесс диверсификации разделен на три этапа

Первый этап - это декомпиляция исполнимого файла в байткод языка РиггАэт, который удобен для произведения -над ним манипуляций по модификации кода без изменения его функциональности, а также имеет ряд особенностей, позволяющих использовать его в целях диверсификации прологов, эпилогов функций, а также кода, адресующего разнородные локальные переменные функций

Во втором этйпе сгенерированный текст на языке РиггАвш передается на вход диверсифицирующему генератору кода (ДГК), обеспечивающему разнородность результирующего кода, транслированного с одних и тех же конструкций нефункциональных преобразований В ходе ряда диверсифицирующих НФП имеющегося кода образуется выходной текст на языке РиигАэт, обладающий функциональностью, идентичной входному тексту Применение преобразований, удовлетворяющих условиям, накладываемым на

диверсифицирующие преобразования, гарантирует функциональную неизменность

кода, и, одновременно, способствует получению кода, не отличающегося от исходного по временным характеристикам

Третьим этапом процесса диверсификации является компиляция байткода FuzzAsm в исполнимый код х86 В процессе генерирования кода х86 происходит псевдослучайная выборка стековых и регистровых переменных для кодирования обращения к локальным переменным кода FuzzAsm в инструкциях х86

Внутреннюю структуру генератора можно представить в виде следующей схемы

Прекомпиляция

Дезассемблирование метакода

Анализ опкодов передачи управления, их предварительная обработка для упрощения работы сборщика Мутация метакода функции

Генерация структуры функции Генерация прототипа функции Анализ используемости переменных Выделение подфункций Генерация мусорного метакода

Обмен произвольных метаинструкцнй и их блоков местами

Компиляция

Проход по всем функциям

Случайное «усиление» текущей инструкции

Генерация кода, соответствующего текущей инструкции метакода, по шаблонам Связывание и настройка выбранных шаблонов

Сборка

Случайное перераспределение порядка следования функций Связывание опкодов передачи управления Связывание абсолютных указателей

Метакод диверсифицирующего генератора кода (FuzzAsm) должен обладать рядом особенностей по сравнению с метакодом стандартного генератора, позволяющих с максимальной полнотой использовать алгоритмы диверсифицирующих преобразований Основными отличиями архитектуры виртуальной машины, состояния которой меняются инструкциями метакода диверсифицирующего генератора, от архитектуры х86 являются следующие положения

1 Набор регистров расширен до 16 32-битных переменных.

2 Возможность назначения регистров в адресуемую память (например, в стековую переменную функции)

3 Сокращенный набор инструкций (операции, ветвления)

4 Адресация регистров, стека и указателей возможна только 32-битными двойными словами

5 Практически все инструкции языка позволяют работать сразу с несколькими объектами

6 Невозможность адресовать стековую память за первыми 32 битами в стеке (LIFO) Перечисленные отличия не являются необходимыми для реализации

диверсифицирующего генератора, они были выбраны как наиболее очевидные расширения архитектуры х86, позволяющие эффективно решить проблему повторяемости сгенерированных последовательностей блоков исполнимого кода Задачей ДГК является псевдослучайная трактовка одних и тех же блоков инструкций метакода в разные блоки исполнимого кода при разных запусках процесса генерирования Требование псевдослучайности выбора шаблонов генерирования и применяемых ДП гарантирует разнородность популяции экземпляров исполнимого кода, сгенерированных с одного и того же исходного кода." В свою очередь, разнородность популяции исключает возможность использования фиксированных адресов кода и фиксированных длин локальных буферов атакующим

Таким образом, первым этапом работы ДГК является мутирование метакода в соответствии с выбранным набором ДП

Процесс генерирования исполнимого кода по зафиксированному метакоду можно описать следующим алгоритмом- '

1 Если текущая метакоманда принадлежит региону метакода, подлежащего генерации, то дизассемблировать текущую метакоманду, иначе выход

2 Перейти к функции, которая сможет транслировать ее в исполнимый код процессора.

3 Исходя из условий генерирования текущей инструкции (используемость переменных, тип заданных переменных — стековые или регистровые), функция случайным образом выбирает шаблон из своего набора фрагментов кода для данной метакоманды, удовлетворяющий указанным требованиям, и настраивает его под конкретную ситуацию.

4. Если текущая инструкция является относительной передачей управления, генератор ставит пометку о типе перехода и пункте назначения, указывая адрес инструкции в метакоде Аналогично генератор поступает, встречая инструкцию абсолютной адресации Впоследствии эта информация будет использована сборщиком для настройки переходов и указателей 5 Сдвинуться на следующую инструкцию и перейти на шаг 1

Сборка кода — финальный этап работы генератора Итогом работы сборщика является объектный файл, который будет передан линкеру для его компоновки с остальными модулями проекта В данной иллюстрации принципов диверсифицирующей компиляции сборщик производит фрагмент исполнимого кода без каких-либо заголовков, базированный на указанный пользователем адрес Этот вид представления итогового результата выбран из-за удобства применения его в системе диверсифицирующей компиляции, о которой речь пойдет ниже.

Задача сборщика—расположить в случайном порядке функции («перетасовать» их) и настроить все относительные и абсолютные указатели в сгенерированном коде Условно его работу можно разделить на два этапа перераспределение порядка следования функций и настройка указателей.

Информация, переданная предыдущими уровнями генератора, содержит адреса и длины всех сгенерированных функций, а также соответствие каждой инструкции исходного метакода адресам начала их шаблона в полученном коде Это позволяет сборщику переформировать полученный код, перетасовав функции и исправив информацию об адресах перемещенных меток

В четвертой главе разрабатываются алгоритмы рекомпиляции исполнимого файла без использования исходного кода, позволяющие осуществить диверсифицирующие преобразования над исполнимым,файлом Под термином рекомпиляция подразумевается процесс, состоящий из двух этапов — преобразования исполнимого кода в вид, позволяющий легко модифицировать алгоритм работы кода и его реализацию в соответствии с выбранными алгоритмами диверсифицирующих преобразований (декомпиляция), и дальнейшего восстановления модифицированного представления кода в исполнимый код целевого процессора (сборка).

Под декомпиляцией региона исполняемого файла подразумевается процесс представления указанного региона памяти этого файла в виде последовательности блоков, удовлетворяющих следующим требованиям'

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

блоки делятся на «представляющие код», «представляющие данные» и

«метки» разделение проводится с точностью, позволяющей выделить в алгоритме декомпилируемого модуля все непрерывные участки кода и данных (когда это возможно), а также относительные указатели (кода на код и кода на данные) и отделить абсолютные ссылки от констант,

внутри одного блока каждый байт данных имеет один и тот же набор флагов Для успешного завершения процесса декомпиляции необходимо иметь корректную информацию о длине блоков. По определению, данные одного блока на всем своем протяжении имеют один и тот же флаг и все участки памяти декомпилируемого региона, имеющие на себя ссылки, помечены как «метки» Следовательно, в результате декомпиляции в наборе блоков будут присутствовать блоки нулевой длины с флагом «метка», а также блоки длиной 4 байта с флагом «ссылка»

Таким образом, необходимо произвести предварительный обход модуля для пометки участков его структуры как «метки», «ссылки», «элементы релокации»

В случае, когда производится декомпиляция модуля целиком, также необходимо пометить соответственные элементы структуры как «присутствующие физически», «присутствующие виртуально», «секционное выравнивание», «файловое выравнивание», «физическое смещение», «ресурсы».

Для выделения кода используется алгоритм многопроходного дизассемблирования региона памяти. Он реализован следующим образом

1 С начала указанного для дизассемблирования региона и до его конца идет поиск байта с флагом РЬ_№ЕХТ, те. помеченного как «начало непроанализированного кода» В случае отсутствия такого флага на всем указанном регионе происходит выход

2 По найденному адресу дизассемблируется инструкция Начиная со второго байта, производится проверка флагов байт памяти, принадлежащих этой инструкции Если окажется, что хоть один из них имеет флаг РЬОРСОБЕ, РЬ_СООЕ, РЬ ЬАВЕЬ или РЬ АКАЬУгЕО, то процесс дизассемблирования завершается с исключением «общая ошибка дизассемблирования», так как такая ситуация может случиться только при неверном распознавании границы инструкций дизассемблером (например, из-за ошибочного определения кода), либо при «жонглировании» опкодами разработчиком анализируемой программы. В любом случае, попытка восстановления кода, дизассемблированного с такой ошибкой, весьма вероятно закончится неудачей

3 Если для инструкции выполняется хотя бы одно из условий

- она не является действительной,

- она является инструкцией относительной передачи управления, но имеет 2-х байтный операнд (16-битный переход в 32-х битном коде),

- она является инструкцией относительной передачи управления с 1- или 4-х байтным операндом, но ее пункт назначения либо находится за концом секции кода, либо указывает на данные, элемент релокации или в середину действительной инструкции,

то инструкция не помечается как действительная и происходит переход на шаг 1

4 Дизассемблированная инструкция помечается как действительная и анализированная. Каждый ее байт маркируется флагами ЕЬАЫАЬУгЕВ и РЬСООЕ (участник инструкции, прошедший анализ), первый байт - флагом РЬ_ОРСОБЕ (начало опкода) В случае, если инструкция представляет собой инструкцию относительного перехода, ее пункт назначения помечается флагами РЬ_ЬАВЕЬ и РЬ_СЛЕР (метка, имеющая ссылку из кода), приведенный к

абсолютному адресу аргумент инструкции связывается с первым

байтом инструкции для последующего корректного заполнения ссылок при составлении блоков инструкций. Если у пункта назначения отсутствует флаг FL_ANALYZED (анализ не был произведен), то первый его байт помечается флагом FLJNEXT (для последующего анализа кода).

5 Если инструкция представляет - собой инструкцию непредсказуемой передачи управления, то происходит пометка инструкции флагом FL_STOP (конец ветки) и переход на шаг 1.

6 К адресу инструкции прибавляется ее длина, алгоритм переходит на шаг 2.

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

При указании лишь точки входа дизассемблер проанализирует все ссылки кода на код, которые обнаружит, проходя по дереву исполнения алгоритма программы - но такой метод выделения кода не учитывает возможность ссылки данных на код, что резко снижает его эффективность

Для устранения этого недостатка вышеприведенный алгоритм дополняется анализом меток, имеющих ссыпки из данных (ссылки элементов релокаций также помечаются как ссылки из данных) и анализом памяти на предмет «потерянного» кода - то есть кода, относительно ссылающегося на код.

Эти дополнительные шаги дизассемблера реализованы следующим образом

1 Этот шаг выполняется сразу после завершения исполнения алгоритма первичного дизассемблирования По всему указанному региону ищется байт с флагом FLJDREF (метка, имеющая ссылку из данных) и с отсутствием флагов FL_NEXT, FL_ANALYZED, FL_FIXUP и FLJ3ATA (помечен для дальнейшего анализа, анализирован, элемент релокации или данные), так как если память по найденному адресу представляет собой код, то она не может иметь вышеперечисленные флаги, либо анализ этого кода уже произведен

2 Память по найденному адресу помечается как анализированная.

3 Начиная с текущего адреса происходит пошаговое дизассемблирование памяти с одновременной проверкой дизассемблированных инструкций на действительность и корректность теми же условиями, которые фигурируют в пунктах 2 и 3 алгоритма первичного дизассемблирования. Если анализируемая ветка завершилась инструкцией непредсказуемой передачи управления и в процессе анализа не встретились некорректные инструкции, то происходит полный анализ памяти этой ветки алгоритма анализируемой программы с помощью вышеописанного алгоритма дизассемблирования После завершения анализа происходит выход из алгоритма.

4 Если ветка не является кодом, происходит переход на шаг 1

В пятой главе выполняется экспериментальная проверка разработанных алгоритмов нефункциональных преобразований на удовлетворение их определениям запутывающих и диверсифицирующих преобразований

В качестве трех тестовых программ были взяты.

- утилита «блокнот» (notepad exe) версии-5 1.2600 3180,

- декодер МРЗ от Winamp 5 34 (in_mp3 dll),

- urlmon.dll из поставки IE6, версия 6 00 2900 3132

Последние две программы объединяет тот факт, что они обе работают с не доверенным потоком структурированных^ данных, который может содержать ошибки, намеренно допущенные с целью нарушения работы целевой системы In_mp3 декодирует звуковые файлы, которые могут быть получены из Интернета; urlmon предоставляет сервисы для скачивания файлов и является одной из составных частей IE6. Ошибка

программиста в обоих продуктах может привести к компрометации системы, исполняющей эти программы, - таким образом, пользователь заинтересован в защите этих продуктов от удаленных атак Цель проведенных тестов - выяснить характеристики НФП, примененных к указанным продуктам. Назовем НФП 1 алгоритм внедрения мусорного кода, адресующего неиспользуемые переменные, НФП 2 - перестановки инструкций, мутацию арифметических операций, изменение прологов и выделение подфункций

Блокнот был выбран в качестве простейшего приложения, принимающего на вход текстовую информацию

Таблица 1 иллюстрирует характеристики указанных приложений до начала процесса диверсификации

Таблица 1 - исходные характеристики п рограмм до диверсш шкации

Длина программы Уровень вложенности Поток данных

Блокнот (notepad exe), 5 1 2600 31 SO 9385 6 1,1

Декодер МРЗ, Winamp 5 34 (m mp3 dll) 34927 13 1,5

UrlMon dll 6 00 2900 3132, IE6 195293 58 3,7

Таблица 2 иллюстрирует вычисленную мощность и временную цену преобразований для трех тестовых приложений

Таблица 2 - мощность и временная цена преобразований для трех тестовых приложений

Мощность Временная цена

Блокнот, НФП 1 19,56 1,00

1п шрЗ, НФП 1 22,64 1,03

Шшоп, НФП 1 20,29 1,00

Блокнот, НФП 2 3,67 1,01

1п трЗ, НФП 2 1,82 1,09

Штоп, НФП 2 2,34 1,02

Из результатов, представленных на таблице 2, следует, что примененные НФП являются не только запутывающими, но и диверсифицирующими Этот факт дает возможность их использования в диверсифицирующем генераторе кода

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

ОСНОВНЫЕ РЕЗУЛЬТАТЫ РАБОТЫ

При решении поставленных в диссертационной работе задач получены следующие научные результаты

1 Предложен метод диверсификации исполнимого кода, который позволяет обезопасить защищаемую систему от удаленных атак, эксплуатирующих неизвестные ранее уязвимости захвата управления

2 Дано строгое определение нефункциональному преобразованию программы, а также диверсифицирующему преобразованию программы Доказано, что НФП обладают рядом свойств, делающих возможным создание алгоритма, осуществляющего диверсификацию кода Разработанные алгоритмы диверсификации ПО с закрытым исходным кодом позволяют осуществлять генерирование разнородных участков кода, обладающих одинаковой функциональностью Язык РиггАэт, разработанный с целью использования его в качестве основного инструмента записи диверсифицированного кода, обеспечивает простоту осуществления диверсифицирующих преобразований на практике

3 Разработанные алгоритмы анализа (декомпиляции) и рекомпиляции ПО с закрытым кодом позволяют интегрировать дополнительный функционал в исполнимый файл с сохранением оригинального функционала Было выполнено обоснование использования НФП с целью противодействия атакам, направленным на срыв стека функции, а также направленным на срыв системной кучи

4 Проведенная экспериментальная проверка разработанных алгоритмов нефункциональных преобразований показала, что все рассмотренные НФП являются одновременно запутывающими и диверсифицирующими, согласно определениям, данным в главе 2, что дает возможность их использования в диверсифицирующем генераторе кода Согласно обоснованию использования диверсифицирующих НФП с целью противодействия'атакам, направленным на срыв стека функции и переполнению системной кучи, данному в главе 3, данные преобразования защищают ПО от атак,

направленных на захват управления

»

По теме диссертационной работы опубликованы следующие основные работы-

1 Терешкин А В Автоматическая рекомпиляция и ее применение в целях защиты программных продуктов от методов обратной инженерии 11 Сборник тезисов и докладов Всероссийской научной конференции молодых ученых и аспирантов «Информационные технологии, системный анализ и управление», Таганрог, 2003 г с 55-57

2 Терешкин А В Нестандартное использование таблицы релокаций РЕ файла // Изд-во ООО «Радиомир Пресс» Радиомир Ваш компьютер №4, 2004 г, с 29-32

1 Терешкин AB Нечеткая компиляция и ее использование в рекомпилирующей системе Ц Материалы VI

Международной научно-практической конференции «Информационная безопасностью, Таганрог 2004 г, с 308-3)0

4 Терёшкин А В Маскирование системных вызовов от систем локального обнаружения вредоносного кода в ОС семейства Windows NT Н Материалы VII Международной научно-практической конференции «Информационная безопасность», Таганрог, 2005 г , с 61-62

5 Tereshicin ТС Rcrätkifs Attacking Personal Frrewaüs // Black Hat USA, Las Vegas, 2006, p 29-30 — -6 Терешкин А В Применение нечеткой компиляции в целях диверсификации ПО // Научная сессия МИФЙ-

2006 ХШ Всероссийская научная конференция «Проблемы информационной безопасности в системе высшей школы» Сборник научных трудов, Москва, 2006 г , с 108- Í 09

7 Терешкин А.В Клонирование функций планировщика потоков в системах семейства Windows "NT // Материалы VIII Международной научно-практической конференции «Информационная безопасность», Таганрог, 2006 г, с 194-202

8 Терешкин А В Нечеткая компиляция и ее использование в целях диверсификации ПО // Материалы VIII Международной научно-практической конференции «Информационная безопасность», Таганрог, 2006 г, с 202 - 203

9 Терёшкин А В Реализация методов нечеткой компиляции в генераторе кода // Известия ТРТУ №9 Специальный выпуск Технические науки Материалы LII научно-технической конференции, Таганрог, 2006 г, с 155-156

10 Терёшкин А В Автоматическое генерирование кода планировщика потоков в системах семейства Windows NT // Известия ТРТУ №16 Тематический выпуск Интеллектуальные и многопроцессорные системы, Таганрог, 2006 г, с 39-43

Программы, созданные в ходе работы над диссертацией, зарегистрированы в

Российском агентстве по патентам и товарным знакам (Роспатент) как программа для ЭВМ,

свидетельство № 2007613219 от 30 07 2007

Формат 60x84 1/16 Бумага офсетная

Печать офсетная Уел п л - 1

Заказ X® Л Н 6 Тираж 100 экз

Издательство Технологического института ЮФУ ГСП 17А, Таганрог, 28, Некрасовский, 44 Типография Технологического института ЮФУ ГСП 17А, Таганрог, 28, Энгельса, 1

Оглавление автор диссертации — кандидата технических наук Терешкин, Александр Васильевич

Введение.

Глава 1. Обзор средств защиты от удаленной эксплуатации уязвимостей.

1.1. Системы, внедряемые во время компиляции.

1.2. Системы, внедряемые на этапе компоновки программы.

1.3. Рандомизация расположения адресного пространства (ASLR).

1.4. Иные проекты.

1.5. Технологии защиты от эксплуатации ошибок в Windows.

1.5.1. Защита стека.

1.5.2. Защита кучи.

1.5.3. Безопасность SEH.

1.5.4. Рандомизация РЕВ.

1.5.5. Определение относительного виртуального адреса API функции.

1.5.6. Переписывание критичных указателей.

1.5.7. Запуск шелкода в РЕВ.

1.5.8. Безопасность указателей.

1.5.9. NX память и аппаратный DEP.

1.6. Выводы.

Глава 2. Теоретическое обоснование возможности диверсификации ПО.

2.1. Формальное определение нефункционального преобразования.

2.1.1. Базовые определения.

2.1.2. Эквивалентность программ.

2.1.3. Нефункциональные преобразования.

2.1.4. Свойства НФП.

2.2. Оценки НФП.

2.2.1. Мощность НФП.

2.2.2. Устойчивость преобразования.

2.2.3 Цена преобразования.

2.2.4 Главная мера.

2.3. Реализация нефункциональных преобразований на процессорах х86.

2.3.1. Замена регистров (уровень 1).

2.3.2. Перестановка множеств инструкций местами (уровень 2).

2.3.3. Процедурный подход (уровень 3).

2.3.4. Изменение прототипа функций (уровень 4).

2.3.5. Выделение случайных подфункций (уровень 5).

2.4. Выводы.

Глава 3. Разработка метода диверсификации программного обеспечения.

3.1. Общая архитектура генератора кода.

3.2. Язык FuzzAsm.

3.3. Используемость переменных.

3.4. Определение каркаса функции.

3.5. Внедрение «мусорного» кода.

3.6. Генерация кода.

3.7. Сборка кода.

3.8. Выводы.

Глава 4. Разработка алгоритмов декомпиляции и рекомпиляции исполнимого кода.

4.1. Декомпиляция.

4.1.1. Этапы декомпиляции.

4.1.2. Анализ структуры РЕ.

4.1.3. Предварительный анализ кода.

4.1.4. Дизассемблирование.

4.1.5. Построение связного списка блоков.

4.2. Рекомпиляция.

4.2.1. Пересчет относительных виртуальных и физических адресов.

4.2.2. Пересчет таблицы элементов релокации.

4.2.3. Перелинковка указателей.

4.2.4. Ассемблирование результатов в файл.

4.3. Выводы.

Глава 5. Экспериментальное исследование алгоритмов диверсифицирующих преобразований.

5.1. Измерение характеристик программ, оценка НФП.

5.2. Выводы.

Введение 2007 год, диссертация по информатике, вычислительной технике и управлению, Терешкин, Александр Васильевич

Актуальность темы

Теория компиляции начала разрабатываться и приобрела законченный вид задолго до того времени, когда необходимость защиты информации дала о себе знать. Возможно, поэтому разработчики компиляторов неохотно модифицируют языки и компиляторы для них, руководствуясь идеями экспертов защиты информации. К примеру, широко известная особенность языков С и С++, позволяющая адресовать элементы массива, находящихся за последним объявленным его элементом, требует от программиста особенного внимания при разработке ПО. Уязвимости в программах (в частности, сетевых), связанных именно с подобного рода ошибками, до сих пор являются самыми распространенными, причем пояснения для написания корректного кода существуют с 1989 года. Лишь относительно недавно появились «надстройки» над компиляторами для автоматического контроля ошибочного кода, причем только для времени исполнения. Ни один разработчик компиляторов языка С/С++ не расширил функциональность языка, добавив в нее проверки диапазонов памяти, к которым возможно обращение генерируемого кода.

Большинство существующих эксплоитов для успешной работы требуют предварительного указания некоторых характеристик, специфичных для атакуемой программной среды - к примеру, эксплоиты переполнения локальных буферов и кучи обычно привязываются к целевой системе путем указания в них фиксированного адреса определенной инструкции, передающей управления на шелкод, либо требуют точного указания размера переполняемого буфера. В обоих приведенных случаях для проведения успешной атаки атакующий должен иметь точную информацию о параметрах целевой системы. Существующие в настоящее время методы защиты от удаленных атак не предусматривают никакую модификацию защищаемого дистрибутива на машине конечного пользователя, тем самым, позволяя атакующему использовать факт абсолютной идентичности всех дистрибутивов атакуемого ПО. При наличии информации об уязвимости, присутствующей в ПО целевой машины, успешность атаки напрямую зависит от возможности обойти установленные механизмы защиты - иначе говоря, для успешной эксплуатации необходима информация об уязвимости целевого ПО и об уязвимости используемой системы защиты. Использование методов модификации исполнимых файлов дистрибутивов без изменения их функциональности, делающих популяцию дистрибутивов на машинах пользователей разнородной (то есть диверсифицированной), позволяет скрыть информацию, необходимую для подготовки эксплоита, что позволяет обезопасить защищаемую систему от удаленных атак, эксплуатирующих неизвестные ранее уязвимости захвата управления.

Таким образом, задача разработки методов защиты от удаленной эксплуатации уязвимостей, диверсифицирующих популяцию дистрибутивов определенного ПО, требует проведения интенсивных исследований и является актуальной.

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

Для достижения указанной цели необходимо решить следующие задачи:

1. Разработать алгоритмы анализа (декомпиляции) ПО с закрытым исходным кодом для последующей модификации.

2. Разработать алгоритмы модификации исполнимого кода, позволяющие защищать ПО с закрытым исходным кодом от атак, использующих фиксированные адреса и фиксированные размеры локальных буферов, с целью захвата управления.

3. Выполнить обоснование использования диверсифицирующих преобразований с целью защиты от атак, направленных на захват управления.

4. Разработать алгоритмы рекомпиляции ПО с закрытым кодом, позволяющие интегрировать дополнительный функционал в исполнимый файл с сохранением оригинального функционала.

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

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

Основные положения и результаты, выносимые на защиту:

1. Метод диверсификации ПО с закрытым исходным кодом.

2. Алгоритмы диверсификации исполнимого кода.

3. Алгоритмы анализа и модификации исполнимого кода, позволяющие осуществить встраивание пассивных алгоритмов защиты путем его рекомпиляции.

4. Результаты экспериментального исследования предлагаемого метода.

Научная новизна работы заключается в следующем:

1. Разработан новый метод диверсификации исполнимого кода ПО.

2. Разработаны теоретические основы диверсификации ПО. Даны определения запутывающим и диверсифицирующим нефункциональным преобразованиям (НФП). Доказано, что НФП обладают рядом свойств, делающих возможным создание алгоритма, осуществляющего диверсификацию кода ПО.

3. Разработаны алгоритмы модификации исполнимого кода ПО, позволяющие осуществить эффективную защиту от атак, направленных на удаленный захват управления.

4. Разработаны алгоритмы анализа (декомпиляции) исполнимого кода в промежуточный код, которые обеспечивают применение алгоритмов модификации ПО.

5. Разработаны алгоритмы рекомпиляции исполнимого кода из промежуточного кода, позволяющие изменять (в т.ч. добавлять) функционал в исполнимые файлы без нарушения их работоспособности.

Практическая ценность работы.

Практическая значимость результатов диссертации заключается в следующем:

1. Разработанный метод диверсификации позволяют осуществить разнородность популяций ПО с целью защиты от удаленных атак.

2. Разработанный метод диверсификации ПО с закрытым исходным кодом может быть использован для защиты проприетарного ПО в системе конечного пользователя.

Использование результатов. Алгоритмы анализа и модификации исполнимого кода, являющиеся одним из основных результатов работы, были использованы ЗАО «РНТ» (г. Москва) при выполнении научно-исследовательской работы «Плеер».

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

Апробация работы. По теме диссертации опубликовано 10 научных статей и тезисов докладов. Основные результаты, полученные в ходе работы над диссертацией, были представлены на:

1. Всероссийской научной конференции студентов и аспирантов «Информационные технологии, системный анализ и управление», Таганрог (2003 г.).

2. Международной научно-практической конференции «Информационная безопасность», Таганрог (2004, 2005, 2006 г.).

3. Международной научно-практической конференции «Black Hat», Jlac-Berac, США (2006 г.).

Заключение диссертация на тему "Разработка и исследование метода защиты от удаленных атак на основе диверсификации программного обеспечения"

5.2. Выводы

В данной главе была проведена экспериментальная проверка разработанных алгоритмов нефункциональных преобразований; приведены результаты экспериментов по вычислению характеристик ранее определенных НФП. Было экспериментально показано, что все рассмотренные НФП являются одновременно запутывающими и диверсифицирующими, согласно определениям, данным в главе 2, что дает возможность их использования в диверсифицирующем генераторе кода.

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

Заключение

В соответствии с поставленными целями, в итоге проведенных исследований и разработок были получены следующие основные научные результаты:

1. Предложен метод диверсификации исполнимого кода, который позволяет обезопасить защищаемую систему от удаленных атак, эксплуатирующих неизвестные ранее уязвимости захвата управления.

2. Дано строгое определение нефункциональному преобразованию программы, а также диверсифицирующему преобразованию программы. Доказано, что НФП обладают рядом свойств, делающих возможным создание алгоритма, осуществляющего диверсификацию кода. Разработанные алгоритмы диверсификации ПО с закрытым исходным кодом позволяют осуществлять генерирование разнородных участков кода, обладающих одинаковой функциональностью. Язык Р^гАвт, разработанный с целью использования его в качестве основного инструмента записи диверсифицированного кода, обеспечивает простоту осуществления диверсифицирующих преобразований на практике.

3. Разработанные алгоритмы анализа (декомпиляции) и рекомпиляции ПО с закрытым кодом позволяют интегрировать дополнительный функционал в исполнимый файл с сохранением оригинального функционала. Было выполнено обоснование использования НФП с целью противодействия атакам, направленным на срыв стека функции, а также направленным на срыв системной кучи.

4. Проведенная экспериментальная проверка разработанных алгоритмов нефункциональных преобразований показала, что все рассмотренные НФП являются одновременно запутывающими и диверсифицирующими, согласно определениям, данным в главе 2, что дает возможность их использования в диверсифицирующем генераторе кода. Согласно обоснованию использования диверсифицирующих НФП с целью противодействия атакам, направленным на срыв стека функции и переполнению системной кучи, данному в главе 3, данные преобразования защищают ПО от атак, направленных на захват управления.

Библиография Терешкин, Александр Васильевич, диссертация по теме Методы и системы защиты информации, информационная безопасность

1. C. Cowan et al. StackGuard: Automatic adaptive detection and prevention of buffer-overflow attacks. In USENIX Security Conference, January 1998. online at http://sheiTv.ifi.unizh.ch/cowan98stackguard.html

2. H Etoh, GCC extension for protecting applications from stack-smashing attacks, http://www.research.ibm.com/trl/projects/security/ssp/ June 20, 20053. 5 Vendicator, Stack Shield, http://www.angelfire.com/sk/stackshield/ June 20, 2005

3. G Richarte, Four different tricks to bypass StackShield and StackGuard protection, 2002, http://wwwl .corest.com/files/files/11 /StackguardPaper.pdf

4. A. Baratloo, T. Tsai, and N. Singh. Transparent Run-Time Defense Against Stack Smashing Attacks. In Proceedings of the USENIX Annual Technical Conference, 2000, online athttp://www.research.avavalabs.com/proiect/libsafe/doc/usenixOQ/paper.html

5. Homepage of the PaX Team, http://pax.grsecurity.net/

6. T. Durden, Bypassing PaX ASLR protection, Phrack 59, Article 9, 2002, available at http://www.phrack.org/show.php?p=59&a=9

7. H Shacham, M Page et al, On the effectiveness of address-space randomization, in Proceedings of the 11th ACM conference on Computer and communications security, 2004 online athttp://www.stanford.edu/~blp/papers/asrandom.pdf

8. Solar Designer, StackPatch, http://www.openwall.com/linux

9. C. Dik, posting to comp.security.unix, January 2, 1997http://groups.google.com/group/comp.security.unix/msg/9fafDc96a3blfc5f

10. H. Etoh, Stack Protection Systems: (propolice, StackGuard, XP SP2), 2005, Presented at CanSecWest 2005, online at http://cansecwest.com/core05/propolicehttp://www.nextgenss.com/papers/defeating'

11. MITRE, CVE Common Vulnerabilities and Exposures, http://cve.mitre.org

12. Y Huang, Protection Against Exploitation of Stack and Heap Overflows, 2003, online at http://www.cgisecurity.com/lib/AntiOverflows.pdf

13. M. Conover, XPSP2 Heap Exploitation.ppt, available at http://www.cvbertech.net/~shOkshOk/heap/

14. A. Anisimov, Defeating Microsoft Windows XP SP2 Heap protection and DEP bypass, 2005, online at http://www.maxpatrol.com/defeating-xpsp2-heap-protection.pdf

15. M. Pietrek, A Crash Course on the Depths of Win32™ Structured Exception Handling, in Microsoft Systems Journal, January 1997, online at http://www.microsoft.eom/msi/Q 197/exception/exception.aspx

16. B. Bray, Compiler Security Checks In Depth, 2002, available at http://msdn.microsoft.com/

17. M. Conover, 0. Horovitz, Reliable Windows Heap Exploits, 2004, presented at CanSecWest 2004, online at http://cansecwest.com/csw04/cswQ4-Oded+Connover.ppt

18. P. Ferrie, F. Perriot, Mostly Harmless, in Virus Bulletin, August 2004, online at http ://pferri e. tripod.com/vb/sasser.pd f

19. A. Ionescu, Introduction to NT Internals, Part 1, 2004, http://www.relsoft.net/Articles/Process/partl.pdf

20. S. Eclipse, kill-bill, 2005, http://www.phreedom.org/solar/exploits/msasn 1 -bitstring/

21. Intel Corporation, IA-32 Intel Architecture Software Developer's Manual, Volume 3, 2005, section 3.8, available athttp://developer.intel.com/design/pentium4/manuals/index new.htm

22. S. Andersen, V. Abella, Changes to Functionality in Microsoft Windows XP Service Pack 2, Part 3, 2004, http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2mempr.insp x

23. G. Wroblewski, General Method of Program Code Obfiiscation, Wroclaw, 2002

24. C. Collberg, C. Thomborson, D. Low, A Taxonomy of Obfuscating Transformations, Technical Report #148, Department of Computer Science, The university of Auckland, 1997

25. M. H. Halstead, Elements of Software Science, Elsevier North-Holland, 1977

26. Warren A. Harrison, Kenneth I. Magel, A complexity measure based on nesting level, SIGPLAN Notices 16(3):63-74,1981

27. Enrique I. Oviedo, Control Flow, Data Flow and Programmers Complexity, Proceedings of COMPSAC 80, Chicaho IL, 1980

28. C. Collberg, C. Thomborson, D. Low, Manufacturing Cheap, Resilient, and Stealthy Opaque Constructs, SIGPLAN-SIGACT POPL'98, ACM Press, San Diego, С A, January 1998

29. Терёшкин A.B. Нечеткая компиляция и ее использование в рекомпилирующей системе // Материалы VI Международной научно-практической конференции «Информационная безопасность», Таганрог, 2004 г.

30. Терёшкин А.В. Применение нечеткой компиляции в целях диверсификации ПО // Научная сессия МИФИ-2006. XIII Всероссийская научная конференция «Проблемы информационной безопасности в системе высшей школы» Сборник научных трудов, Москва, 2006 г.

31. Терёшкин А.В. Нечеткая компиляция и ее использование в целях диверсификации ПО // Материалы VIII Международной научно-практической конференции «Информационная безопасность», Таганрог, 2006 г.

32. Терёшкин А.В. Реализация методов нечеткой компиляции в генераторе кода // Известия ТРТУ №9 Специальный выпуск. Технические науки Материалы LII научно-технической конференции, Таганрог, 2006 г.

33. Терёшкин А.В. Маскирование системных вызовов от систем локального обнаружения вредоносного кода в ОС семейства Windows NT // Материалы VII Международной научно-практической конференции «Информационная безопасность», Таганрог, 2005 г.

34. Терёшкин А.В. Клонирование функций планировщика потоков в системах семейства Windows NT // Материалы VIII Международной научно-практической конференции «Информационная безопасность», Таганрог, 2006 г.

35. Терёшкин А.В. Нестандартное использование таблицы релокаций РЕ файла // Изд-во ООО «Радиомир Пресс». Радиомир. Ваш компьютер, №4, 2004 г.

36. Tereshkin A. Rootkits: Attacking Personal Firewalls // Black Hat USA, Las Vegas, 2006

37. Терёшкин А.В. Автоматическое генерирование кода планировщика потоков в системах семейства Windows NT // Известия ТРТУ №16 Тематический выпуск. Интеллектуальные и многопроцессорные системы, Таганрог, 2006 г.

38. S. Muchnik. Advanced Compiler Design Implementation // Academic Press, San Diego, CA, 1997

39. Y.N. Srikant, P. Shankar. The Compiler Design Handbook. Optimizations and Machine Code Generation // CRC Press, 2003.

40. A. Ахо, P. Сети, Дж. Ульман. Компиляторы: принципы, технологии и инструменты // Вильяме, 2003.

41. А. В. Костельцов. Построение интерпретаторов и компиляторов // СПб: Наука и Техника, 2001.

42. А. V. Aho, S. С. Johnson and J.D. Ullman, Code generation for expressions with common subexpressions, J. ACM, 24(1), January 1997.

43. J.R. Allen, K. Kennedy, C. Porterfield and J. Warren, Conversion of Control Dependence to Data Dependence, in conference Record for the 10th Annual ACM Symposium on Principles of Programming Languages, Austin, TX, January 1983.

44. К. Gallaher, J. Lyle, Using program slicing in software maintenance, IEEE Trans. Software Eng,. SE-17(8), August 1991.

45. D. Binkley, K.B. Gallaher, Program slicing, Adv. Comput., M. Zelkowitz, Ed., Academic Press, San Diego, CA, 1996.

46. M. Weiser, Program slicing, IEEE Trans. Software Eng,. 10(4), July 1984.

47. R. Allen, K. Kennedy, Optimizing Compilers for Modern Architectures, Morgan Kaufman, San Francisco, 2002.

48. P. Feautrier, Dataflow analysis of array and scalar references, Int. J. Parallel Programming, 20(1), February, 1991.

49. U. Benerjee, A theory of loop permutations, in Languages and Compilers for Parallel Processing, Research Monographs in Parallel and Distributed Computing, D. Gelernter, A. Nicolau and D. Padua, Eds., Pitman, London, 1990.

50. A. Appel, Modern Compiler Implementation in C, Cambridge University Press, London, 1998.

51. A. Appel, К. Supowit, Generalization of the Sethi-Ullman algorithm for register allocation, September 1996.

52. G. J. Chaitin, M.A. Alexander, A.K. Chandra, J.Cocke, M.E. Hopkins, P.W. Markstein, Register Allocation via coloring, Comput. Langages, 6,1981.

53. K.D. Cooper, T.J. Harvey, L. Torczon, How to build an interference graph, Software-Pract. Exper., 1998.

54. L.J. Hendren, G.R. Gao, E.R. Altman, C. Mukerjii, A Register Allocation Framework Based on Hierarchical Cyclic Interval Graphs, ACAPS Technical Memo 33 (revised), McGill University, February, 1993.

55. J. Fabri, Automatic Storage Optimization, SIGPLAN'79, 1979.

56. T.A. Proebsting, C.N. Fischer, Probabilistic Register Allocation

57. C. Ferdinand, H. Seldi, R. Wilhelm, Tree automata for code selection, Acta Inf,., 31, 1994.

58. M.Ganapathi, C.N. Fischer, J.L. Hennessy, Retargetable compiler code generation, Comput. Surv., 14(4), 1982.

59. E. Pelegri-Llopart, S.L. Graham, Optimal Code Generation for Expression Trees, in Proceedings of the 15th ACM Symposium on Principles of Programming Languages, 1988.

60. R. Wilhelm, D. Maurer, Compiler Design, International Computer Science Series, Addison-Wesley, Reading, MA, 1995.

61. M. Wolfe, Advanced Loop Interchange, in Proceedings 1986 International Conference on Parallel Processing, St. Charles, IL, August 1986.

62. M.J. Wolfe, C. Tseng, The power test for data dependence, IEEE Trans. Parallel and Distributes Syst., 3(5), September 1992.

63. A.C. Myers, Bidirectional object layout for separate compilation, in OOPSLA'95 Conference Proceedings: Object-Oriented Programming Systems, Languages and Applications, ACM Press, New York, 1995.

64. R.E. Hank, W.-M. Hwu, B.R. Rau, Region-based Compilation: Anth1.troduction and Motivation, in 28 IEEE-ACM International Symposium on Microarchitecture (MICRO), Ann Arbor, MI, 1995.

65. F. Mueller, D. Whalley, Avoiding Conditional Branches by Code Replication, in ACM SIGPLAN Conference on Programming Language Design and Implementation, La Jolla, CA, 1995.

66. В. Steffen, Data Flow Analysis as Model Checking, TACS, Sendai, Japan, Lecture Notes in Computer Science, Vol. 526, Springer-Verlag, New York, 1991.

67. Yinrong Huang. «Разнообразие ради выживания. Популяция из различных исполняемых модулей с одинаковой функциональностью». http://www.bugtraq.ru/librarv/programming/diversifv.html

68. J. Davidson, S. Jinturkar, Memory Access Coalescing: A Technique for eliminating Redundant Memory Access, in ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI), Orlando, FL, June 1994.

69. T. Reps, S. Horwitz, M. Sagiv, Precise Interprocedural Dataflow Analysis Via Graph Reachability, in ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages (POPL), San Francisco, CA, January 1995.