Упаковщики исполняемых файлов в LINUX-BSD


         

внешний вид ядерного отладчика linice, своеобразного аналога soft-ice для Linux


Морской волк Chris Eagle (cseagle@nps.navy.mil) пошел другим путем и на той же самой презентации продемонстрировал поиметь Шиву во все дыры (понятное дело — морская пехота, хоть и американская). Вместо поиска отладчиков, работающий в обход ptrace, он разработал отладчик-эмулятор x86-процессора, выполненный в виде плагига для IDA Pro и бесплатно распространяемый в исходных текстах: http://sourceforge.net/projects/ida-x86emu, однако, имейте ввиду, что для его компиляции требуется IDA SDK, которая есть не у всех.

Текст мультимедийной презентации с описанием методики взлома лежит на Black Hat'e: http://www.blackhat.com/presentations/bh-federal-03/bh-federal-03-eagle/bh-fed-03-eagle.pdf, а набор утилит для взлома (включающий в себя автоматический распаковщик и несколько полезных скрипитов для IDA Pro, упрощающих расшифровку), находятся в соседнем файле: www.blackhat.com/presentations/bh-federal-03/bh-federal-03-eagle/bh-federal-03-eagle.zip.

Теперь что касается расшифровки. Чтобы противостоять дампу даже на уровне ядра, Shiva использует динамическую расшифровку по требованию (on demand). Неиспользуемые в данный момент страницы заполняются байтами CCh, представляющими собой инструкцию INT 03h, передающую управление материнскому процессу-отладчику при попытке их выполнения, что сигнализирует о необходимости их расшифровки, которая осуществляется "подкачкой" недостающих байтов из "резервного" хранилища (Armadillo, помниться, менял атрибуты доступа страниц). Разумеется, этот трюк работает только с кодом, а с данными он не катит и их приходится расшифровывать статическим расшифровщиком.

В дополнении к этому, Shiva заменяет в расшифрованных блоках инструкции PUSH, JMP и CALL на INT 03h и эмулирует их выполнение. Все очень просто. Shiva держит в памяти специальную таблицу с адресами замещенных инструкций и если TRAP по выполнению INT 03 приходит по одному из этих адресов — врубается механизм эмуляции. В практическом плане это означает, что даже расшифровав _все_ зашифрованные блоки, мы все равно не сможем избавиться от Siva RTL (среды исполнения) и будем вынуждены "тащить" упаковщик за собой, если конечно, не декодируем эту таблицу адресов и не восстановим "украденные" команды.

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



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