пятница, 27 февраля 2009 г.

История одного взлома

Буквально сегодня мне понадобилось по работе немножечко взломать одну программу лину(назовём её crackme.exe). Собственно ничего особенного и криминального нет - программа куплена, но имеет некоторые настройки(а именно SQL запросы), которые нужно было модифицировать. Данные хранились в запароленной Access базе (.mdb), которая лежала в запароленном zip архиве.
Была поставлена задача - извлечь mdb файлик, с целью поглумиться над ним в дальнейшем.

В начале я решил посмотреть, что ценного программа создаёт в всяческих TEMP-ах. Чтоб не путаться с остальными программами сделал так
mkdir mytemp
set TEMP=mytemp
set TMP=mytemp
crackme.exe

Вуаля. Все временные файлы этой и только этой программы лежат в поддиректории mytemp, и пару из них имеют многообещающие названия JETxxxxx. Ну, думаю, это временно распакованная база, вот свезло, так свезло! Глядь - а она не открывается. Файл размера 0. Ясно, думаю, запретили одновременный доступ. Быстрым движением рук убиваю процесс, чтоб он стервец не успел поудалять временные файлы. Смотрю - успел. Ишь ты шустрик какой, видно создавал темпы с флажком FILE_TEMP (или как там его), чтоб после завершения работы программы он автоматически удалялся системой. И ведь удаляется!

Ладно, начал размышлять, как бы изменить параметры создаваемого временного файла, и тут подумал "think different". Взял в руки task manager 'procxp' от Марка Руссиновича и стал изучать чего вообще там программа держит. Какие файлы, темпы, DLL-ки и объекты.
Ага! Программа держит файлик называющийся в точности как нужная мне база, где-то в Application Data. Перемудрил я немного, никто в темпах и не скрывался, всё вполне открыто лежит.

Ну, теперь нужно вскрыть эту mdb базу консервным ножом. Ищем нож в интернете, находим, скачиваем и запускаем. Нож рапортует "пароль восстановлен. давайте деньги". Вот ещё, платить деньги за 1 секунду работы :( Ищу дальше, и в конце концов нахожу Open Source консервный ножик, написанный на Java. Запускаю и тут же получаю пароль. В голову закрадывается мысль, что в Microsoft сидят идиоты, в частности те, кто писал запароливание Access баз.

Получаю пароль и отсылаю по месту требования. Все радуются и переходят к обеду.

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

Нахожу какой-то восстанавливатель паролей для zip архивов, запускаю - и вижу удручающую картину. Шифрование zip-ов писали не кретины: программа перебирает, перебирает и конца этому не видно. Впрочем, конец всё-таки наступил, и довольно быстро - программа через 5 минут работы потребовала денег. Жадные, все какие :(
Искать бесплатный аналог бесполезно, пары лет в запасе у меня нет.

Опять начинаю "думать по другому". Ладно, возьму отладчик SoftICE и им расколупаю, что угодно. Нахожу одну версию, ставлю, получаю BSoD. Нахожу другую версию - цвет не менее синий и не менее смертельный :( Опять просачивается мысль про идиотов, теперь уже в NuMega или Compuware (уже запамятовал чей этот дебаггер сейчас).

Так. Скоро я вообще перестану думать нормально, а только "different". Снова приходит мысль - ищу в зависимостях какие-нибудь интересные DLL-ки. Нахожу только msvbvm60.dll. Вижуал васик, говорю себе грустно.

Тут начальник упоминает про какую-то DLL. Уточняю - оказывается он посмотрел exe обычным notepad-ом и увидел там строку 'sevZip30.dll'. Смотрю Far-ом (нет у меня доверия к нотпаду). Ну точно, есть такая строчка. Значит грузит во время работы! Собственно, чего ещё ожидать от васика. Нахожу этот файл в c:\windows\system32. Так они ещё и мусорят в системной директории, сцуки :(

Рождаю мысль написать DLL-переходник. Программа вызывает мой переходник, который в свою очередь вызывает реальную DLL. А по пути ненавязчиво собираем передаваемые параметры, среди которых будет пароль!

Скачиваю masm, и начинаю понимать, что ассемблер то я совсем забыл. Ну ничего, после непродолжительного гугления, нахожу програмулину, выполняющую то, что надо - генерирующую подобный переходник. Ура. Запускаю и получаю ошибку :( Та-а-к, заглядываю в DLL и вижу - дело не чисто, тут порылся UPX. Скачиваю UPX, распаковываю DLL и снова натравливаю утилитку. Опять ошибка, хотя и другая :(

Ладно, в голову приходит свежая идея. Берём IDA Pro и дизассемблируем файлик. Авось найдётся алгоритм генерации пароля, или что там у них.

Качаю, устанавливаю, начиню дизассемблирование. Да... IDA Pro - мощнейшая штука... Час лажу по дизассемблированному исходнику, и тут... Звонит начальник и сообщает, что эти запросы, оказывается, можно редактировать прямо из программы! Собственно, почти день работы на смарку! Но остановиться уже не могу - подлая программа должна быть побеждена!

Внутренний генератор идей не на шутку разошёлся сегодня и выдал ещё одну - в начале функции UnZip влепить 0xCC, что как известно int 3. Программа загрузит dll, дёрнет функцию, функция наступит на int 3, подскользнётся и рухнет. Тут я её сачком и накрою aka обычным отладчиком из Visual Studio. И уже из студии посмотрю стек, а в нём... пароль.

Сказано сделано. В IDA нашёл где начинается функция UnZip, скачал двоичный редактор WinHEX и влепил в нужное место 0xCC. Запустил программу а сам притаился перед монитором. Бабах! Программа выполнила невыполнимую операцию и будет отлажена. Хлоп - накрываю её сачком. Смотрю стек и нахожу странно-подозрительный параметр 'firefox'. Эге-ж. Открываю архив, подсовываю 'firefox' в качестве пароля. Канает! Он.

Дело закрыто.

З.Ы. А создателям программулины - решпект. Firefox, понимаиш!

5 комментариев:

Анонимный комментирует...

Молодец, добил таки прогу! Читал с огромным удовольствием :)

Но остановиться уже не могу - подлая программа должна быть побеждена!

Прекрасно помню это чувство, хотя сам уже давно не ковырял проги. А когда первый раз отучил третьих «Героев» от диска, от радости подпрыгнул на стуле, и сломал его :D

Анонимный комментирует...

Кстати, нарыл сегодня замену SoftICE, это китайский отладчик Syser. Посмотри у меня в блоге про него.

Сергей Азаркевич комментирует...

Syser я даже скачивал, но что-то меня остановило от его использования. По-моему какая-то очередная новая мысль :)

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

Dmitrii 'Mamut' Dimandt комментирует...

Пр работе акцеса пароль открытым текстом лежит в памяти процесса :)

так было, как мининмум еще в 2000-х виндах :)

Анонимный комментирует...
Этот комментарий был удален администратором блога.