Как сокрушают протекторы

Крис Касперски

Хакер, номер #092, стр. 092-102-1

Обзор упаковщиков исполняемых файлов под *nix

Долгое время единственным упаковщиком исполняемых файлов в *nix был легендарный UPX, содержащий встроенный декомпрессор и распаковывающий файлы без особого труда. Но сейчас ситуация изменилась, и упаковщики стали появляться, как грибы после дождя. Ими охотно пользуются разработчики коммерческих программ с закрытым кодом, не задумываясь о том, какие проблемы они создают своим пользователям. Сегодня мы покажем, как, не будучи хакером и не имея навыков в дизассемблировании или отладке, победить наиболее популярные упаковщики (ELFCrypt, UPX, Bueye и Shiva).

Введение

Упаковщики исполняемых файлов часто используются для затруднения анализа программы и препятствия взлому. Упакованный файл потребляет намного больше оперативной памяти, а на некоторых *nix-клонах вообще отказывается запускаться или работает нестабильно. В первую очередь это касается *BSD (основная масса упаковщиков ориентирована на Linux) и экзотических систем с экспериментальными ядрами наподобие Hurd. В результате от упаковщиков/протекторов стремится избавиться даже тот, кто вообще не собирался ничего ломать!

ELFCrypt

Происхождение: создан индийским студентом по прозвищу JunkCode. Распространяется в исходных текстах на бесплатной основе: www.infogreg.com/source-code/public-domain/elfcrypt-v1.0.html.

Описание: простейший шифровщик (не упаковщик!) ELF-файлов, шифрующий файл по XOR случайно генерируемым ключом. Присваивает кодовой секции атрибут writable и не убирает его после завершения расшифровки (что может приводить к некорректной работе программ, проверяющих возможность модификации кодовой секции). Остальные секции (и секция данных в том числе!) остаются незашифрованными. Не содержит никаких антиотладочных приемов, но подкладывает две большие свиньи дизассемблерам: «забывает» скорректировать метку _start и размещает свой код в секции exte, истинное содержимое которой IDA Pro отображает только в режиме ручной загрузки при выбранной опции: «Force using of PHT instead of SHT».

Распаковка: загружаем файл в Hiew, двойным нажатием <ENTER>'а переходим в режим дизассемблера, давим <F8> для отображения заголовка и переходим в точку входа по <F5>. Здесь прослеживается следующий код:

КОД

Дизассемблерный листинг окрестной точки входа программы, зашифрованной ELFCrypt'ом

; переходим на расшифровщик

.080495DC: EB02 jmps .0080495E0

; мусор, оставленный транслятором ассемблера

.080495DE: 06 push es

.080495DF: C6 ???

; сохраняем в стеке все регистры и флаги

.080495E0: 60 pushad

.080495E1: 9C pushfd

; начало расшифровываемого фрагмента

.080495E2: BEC0820408 mov esi, 0080482C0

.080495E7: 8BFE mov edi, esi

; количество двойных слов для расшифровки

.080495E9: B978000000 mov ecx, 000000078

; ключ расшифровки

.080495EE: BBBD03CC09 mov ebx, 009CC03BD

; читаем очередное двойное слово

.080495F3: AD lodsd

; расшифровываем через xor

.080495F4: 33C3 xor eax,ebx

; записываем результат на место

.080495F6: AB stosd

; мотаем цикл

.080495F7: E2FA loop .0080495F3

; восстанавливаем из стека флаги и регистры

Содержание  Вперед на стр. 092-102-2
ttfb: 2.9940605163574 ms