Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lecture13.doc
Скачиваний:
83
Добавлен:
16.04.2013
Размер:
151.04 Кб
Скачать

13.5. Методы нейтрализации защиты

Для понимания основных приемов, используемых при проектировании и реализации систем защиты от НСК, необходимо знать основные методы их нейтрализации, применяемые злоумышленниками.

Нейтрализация системы защиты в целом может вестись по двум направлениям.

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

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

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

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

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

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

09D8:0140 CMP BYTE PTR [A76C],00

0908:0145 JNZ 014В

0908:0148 САLLOС50

09D8:014В МОV АН,18

Первая строка кода проверяет значение, содержащееся в заданной области памяти. Если в памяти содержится значение QD, команда сравнения поставит флаг Z процессора в положение "включен", а если любое другое значение — в положение "выключен".

Во второй строке кода на основании результатов выполнения команды сравнения JNZ принимается решение, производить ли переход. Команда JNZ выполнит переход на четвертую строку кода, если флаг Z "выключен". Таким образом, вызов подпрограммы, которая выводит на экран предупреждения, в третьей строке будет обойден. Если же флаг Z "включен", переход не произойдет, и вызов будет выполнен.

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

Четвертая строка кода — просто некая следующая команда в программе.

Таким образом, задача состоит в том, чтобы обойти вызов подпрограммы в третьей строке. Для этого существует несколько способов. На- пример, достаточно заменить команду JNZ 014В на команду JMP 014В— команду безусловного перехода, В этом случае очевидно, что вызов третьей строки будет обойден независимо от того, что содержится в памяти по адресу, на который ссылается первая строка кода.

Можно также внести такие изменения, чтобы заменить команду JNZ на инверсную – JZ 014В, т.е. переход будет сделан, когда в памяти содержится 00. Возможна и замена CMP BYTE PTR [A76C],00 на команду JMP 014В.

Наконец, возможна замена вызова в третьей строке на команду NOP – и это допустимо, поскольку вызов подпрограммы является внутренним, т.е. вызовом со ссылкой на кодовую строку, находящуюся в том же самом сегменте кода, что и команда вызова. Однако следует учитывать, что помимо внутрисегментных существуют и другие вызовы, в которых организуются ссылки на команды вне текущего сегмента кода. Это внесегментные вызовы, и они должны быть обработаны по-другому. Выглядят они как CALL 0934:ОАС5 или CALL FAR 0002.

Для приведенного примера использование команды NOP и удобно, и приемлемо. NOP – сокращение от NoOPeration(нет операции), это допустимая команда, которую понимает микропроцессор. Длина ее равна одному байту, а длина команды вызова – три байта. Таким образом, при замене команды вызова на NOP необходимо ввести команду NOP три раза, а в случае замены CMP BYTE PTR [A76C],00 на JMP 014В требуется дополнить последнюю командой NOP. Поскольку команда сравнения имеет длину 5 байт, а команда перехода — только 2 байта, то соответственно последняя требует дополнения тремя командами NOP, чтобы ее длина была равна длине команды сравнения. Иначе происходит изменение адреса каждой последующей команды.

Когда же в программе встречается команда NOP, никакого действия не происходит, просто увеличивается счетчик команд СS:IP и процессор обращается к следующей команде. Большинство трансляторов постоянно вставляет NOP в код, и эта команда очень полезна для выравнивания размеров кодовых строк.

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

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

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

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

П р и м е р 1. Рассмотрим следующий фрагмент кода:

0234:ОВ54 МОVCX,0003 ; Три раза вспомогательная программа

0234:ОВ5А DEC CX ; будет уменьшать содержимое счетчика

; на единицу, прежде чем по

0234:ОВ58 JCXZ 031А ; условию CX=0000 включится

0234:ОВ60 PUSH СХ ; блок ответной реакции

0234:ОВ61 PUSH DS

0234:ОВ62 PUSH ES

0234:ОВ63 CALL 035F:112D ; Вызов блока установки характеристик среды 0234:ОВ68 OR А1,AL ; Определяются условия активизации

0234:ОВ6А JNZ 0В6Е ; Да, блок должен активизироваться

0234:OB6C JMP 0В5А ; Нет, уменьшается значение счетчика

0234:OB6E CALL 8133 ; Некая следующая команда

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

Этот код сильно отличается от предыдущего, и простая замена в девятой строке команды JNZ ОВ6Е на команду JMP ОВ6Е заставит код выполняться лишь временно.

Итак, метод внесения исправлений в программу заменой вызова подпрограммы на набор команд NOP не срабатывает, и требуется под управлением отладчика все-таки выполнить вызов из седьмой строки кода, чтобы проанализировать, что происходит внутри подпрограммы, и ее вызов уже не может быть заменен на NOP, так как он межсегментный. Когда программа выполняет команду FAR CALL (обращение к сегменту памяти вне текущего сегмента кода), то осуществляется переход по адресу, который был назначен этому сегменту на время выполнения программы. В этом случае следует учитывать конкретные значения CS, DS, ES и SS, формируемые и доступные только при выполнении программы, так как они отсутствуют в файле программы, находящемся на диске. Именно поэтому в этих условиях нельзя заменять FAR CALL на NOP.

Однако адреса для обращений внутри одного и того же сегмента кода будут содержатся в файле программы, поскольку в данном случае, даже если файл программы и не содержит настоящие адреса сегментов, смещения внутри сегментов, которые всегда будут оставаться теми же самыми, вполне достаточны для правильной работы программы.

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

035F:112D MOV [324F],ВХ ; Контроль ошибок

035F:1131 CMP BYTE PTR [ВХ+06],03

035F:1135 JNZ 0339

035F:1137 CALL F157 ; Вызов блока установки

; характеристик среды

035F:113А МОVDl,[0332] ; Эта подпрограмма сравнивает

035F:113D МОV ES,DX ; некоторые значения

035F:1140 МОV DS,ВХ ; Проверка идет побайтно

035F:1144 MOV Sl,[0144]

035F:1148 MOV CX, [0097] ; Количество сравниваемых байтов

035F:114C REPE CMPSB ; определяется значением CX

035F:114F JСХZ 1154 ; Эта подпрограмма устанавливает

035F:1151 JMP 1161 ; значение переменной в памяти

035F:1154 МОV АХ,0001 ; Если проверка прошла успешно,

035F:1159 MOV [0978],АХ ; помещается 01

035F:115Е JMP 116В ; Иначе заносится 00

035F:1161 MOV АХ,0000

035Р:1166 МОV [0978],АХ

035F:116В POP ES ; Подготовка к возврату из

035Е:116C POP DS ; подпрограммы

035F:116D POP СХ

035F:116Е RETF ; Возврат из подпрограммы

(Разумеется, код является упрощенным – он используется только для примера.)

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

Внешний цикл подпрограммы принимает решение о необходимых переходах по результатам работы подпрограммы. Чтобы его скорректировать, требуется заменить команду MOV [324F], ВХ на команду JMP 116В. Это восстановит регистры и возвратит управление из подпрограммы без выполнения кодов внутри подпрограммы. Но при этом потребуется исправить и команду девятой строки JNZ 0В6Е на команду JMP 0В6Е во внешнем цикле, поскольку теперь для продолжения программы требуется выполнение безусловного перехода. Однако это не решает проблему игнорирования необходимого значения переменной в памяти, к которой может обращаться неизвестный блок сравнения характеристик среды.

Более "изысканный" метод должен был бы изменить в строке 11 подпрограммы команду JCXZ 1154 на команду JMP 1154. В том случае, когда блок сравнения характеристик среды попытается осуществить сравнение, в анализируемой ячейке памяти будет установлена "правильная" переменная, и работа программы в штатном режиме не прервется независимо от того, какими данными будет загружена эта ячейка памяти. Однако и такой метод не вполне совершенен, поскольку он все же предоставляет блоку ответной реакции возможность сработать, хотя и только для проверки некоторых условий.

Лучший метод в данном случае состоит в том, чтобы заменить четвертую строку подпрограммы CALL F157 на JMP 1154. Этот метод уже полностью исключит запуск блока установки характеристик среды поместит "правильную" переменную в память и корректно вернет управление из подпрограммы. При применении этого метода не нужно и исправлять внешний цикл.

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

Соседние файлы в предмете Предмет и задачи программно-аппаратной защиты информации