21 мая 2012 г.

Введение в реверс инженеринг используя IDA - Глава 4

Переходим к следующей части серии лекций от Рикардо Нарваха которая идет под номером 15. Посмотреть перевод ее можно на томже wasm.ru по вот этой ссылке.

Возмем crackme под названием SAMBO, его можно скачать тут. Открываем в IDA Pro фаил sambo.exe и видим мало приятную картину:




Есть у меня подозрение что фаил запакован, посмотрим, что у него в секциях находится, для этого жмем CTRL+S.

 
И видим надпись .aspack, ну так и есть, фаил запакован, как его распаковывать, будет в следующих главах, а пока посмотрим что можно сделать не занимаясь распаковкой. Нажимаем F9   запускается программа. Когда она запускается, то распаковывается в память код программы, после чего можно ее проанализировать.
Смотрим снова на секции для этого нажимаем CTRL+S, они поменялись и выглядят теперь немного по другому:

 
Код программы по идее должен распаковаться по адресу 401000, нам нада поставить брякопинт на выполнение кода, чтобы зацепиться за программу и поглядеть что за текстовые строки можно будет найти. Нажимаем на буковку G, это прыгнуть на адрес, выбираем там строчку какую нибудь и ставим брякопинт. После чего нажимаем на брякпоинт ПКМ и выбираем Edit breakpoint, в открывшемся окне, ставим галки на hardware и выбираем опцию Execute, это нам даст точку останова когда код начнет выполняться. Выглядит это както вот так:

Мда, программа не останавливается, попробуем зайти с другого боку. Снимаем брякпоинты и запускаем программу, когда появиться окно ввода серийного номера жмем на кнопочку пауза. В меню это Debbuger->Pause Process. По идее программа должна была распаковаться в памяти, так что надо бы поискать там какие нибудь интересные строк. Нажимаем Shift+12 или View->Open Subviews->Strings. Ого сколько тут всякой фигни, необходимо немного уменьшить список чтобы глаз радовался, нажимаем ПКМ на список и выбираем Setup, а в появившемся меню Display only defined stings. Список не шибко уменьшился, ну хоть так, глядим что там есть. К стати в списке очень не хватает поиска :(.
Но всетаки находятся интересные строки nope, "actually it was wrong", это то за что мы можем зацепиться.

 
Ставим на эту строчку точку останова. Нажимаем F9 и серийник от балды, например 1234test5678. Отладчик останавливается внутри user32.dll. Теперь необходимо выйти из системной библиотеки, делать нам особа там нечего. Выключаем брякпоинт(иначе будем постоянно на нем дергаться) и нажимаем несколько раз CTRL+F7, что означает выполнять программу до выхода из процедуры. Доходим до того момента, пока не появимся в процедуре программы. Это покажет нам .text перед адресами в памяти. Нажимаем на пробел, чтобы окинуть вид в графическом представлении.

 
Хм, никаких переходов явных не видно, возможно мы слишком глубоко в программе. Нажмем еще раз CTRL+F7 ну или дотрейсим руками кнопочкой F8. А вот это уже другое дело, то что нужно, вилка которая выдает сообщения.


 
IDA Pro услужливо распознало строки и теперь проще понять код. Явно видно, что проверка осуществляется по адресу 00401AFF. Проверим, ставим на него breakpoint и нажимаем F9. Мигающая стрелка указывает, что уйдем в сторону неправильного серийника. Меняем флаг Z с еденицы на ноль. Загорается стрелочка в другую сторону. Нажимаем на F9  - радуемся результату. Серийник принят.
Видим, что сравнение выглядит в виде:
00401AFD test    cl, cl
А перед ним идет постановление ecx из стека, значит гдето оно в стек помещается. Ставим брякпоинт на вызов процедуры чуть выше. И перезапускаем программу нажимая F9. Пока ничего не понятно, но в стеке видим что в ecx уже занесен ноль, значит гдето раньше идет сверка. Посмотрим повыше чтонить, видим там:

.text:00401AD6 call    sub_47BF94
.text:00401ADB push    eax
Не тутли идет сверка сериника, ставим брякпоинт на вызов процедуры. Зайдем кнопкой F7 в процедуру и посмотрим что там.

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

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

Комментариев нет:

Отправить комментарий