Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Необходимо обновить браузер или попробовать использовать другой.
Введение в реверсинг с нуля используя IDA PRO. Часть 1
Дата публикации 12 фев 2017 | Редактировалось 2 дек 2018
Приветствуя тебя, Гость.
Если тебе не очень понравится данный перевод, хочу сказать, что дальше всё становится лучше. Уже сейчас ты можешь открыть последние главы, например №24 или №25 и увидеть, что всё читается по другому. Как только курс будет переведён и закончен, я вернусь к первым главам и переделаю их.
ВВЕДЕНИЕ В РЕВЕРСИНГ С НУЛЯ ИСПОЛЬЗУЯ IDA PRO
Идея этих серий учебных пособий является обновить наш оригинальный курс по реверсингу, но используя IDA PRO. Будем обучаться использовать ее с нуля и работать будем с последней версией Windows. В моем случае, я использую Windows 10 Anniversary Update x64 со всеми патчами, вплоть до 29 октября 2016.
ПОЧЕМУ ИМЕННО IDA PRO
Потому что, пока OllyDBG просто 32-х битный отладчик режима пользователя, а IDA PRO целая программа для реверсинга, которая может быть использована в 32/64 системах, как и отладчик и как дизассемблер. Она позволяет делать статический реверс, который не может быть выполнен в OllyDBG и которая обучает как использовать ее, не смотря на сложный процесс обучения, она позволяет работать в Windows, Linux или Mac как внутри системы, так и удаленно в следующих операционных системах.
Для того, чтобы иметь представление о поддерживаемых процессорах, здесь есть список.
Как мы можем видеть, обучение как использовать IDA позволяет нам улучшить рабочее окружение, мы сфокусируемся на 32/64 разрядной Windows в пользовательском режиме и иногда в режиме ядра. Это позволит нам легче адаптироваться к любому использованию .
Здесь мы увидим большинство вещей, которые мы видели в Введение в отладку с нуля с использованием OllyDBG, но сейчас будет IDA. Попытаемся идти дальше с самого начала.
В этом курсе будет всё: статический и динамический реверс, крякме, будем учиться исследовать эксплоиты и распаковку. Я постараюсь писать о какой-нибудь важной детали с нуля.
Нам нужна IDA PRO. Проблема в том, что это коммерческая программа и мы должны платить за нее и она того стоит. Мы не можем и не будем распространять её, но вы можете поискать утекшие в сеть версии через Гугл по такому запросу: IDA PRO 6.8 + HEXRAYS. Эта версия с которой мы будем работать. Последняя же версия — IDA 6.95.160808 ( 08 Августа 2016).
Когда мы скачали, можем увидеть zip файлы и такой установщик
idapronw_hexarmw_hexx64w_hexx86w_150413_cb5d8b3937caf856aaae75 0455d2b4ae
Пароль на установку хранится в файле install_pass.txt.
Также будет установлен Python 2.7.6. Он используется, чтобы избежать проблем используя другие версии IDA. Если вы установили Питон самостоятельно отдельно, он должен быть той же версии, что использует IDA.
После установки, загрузим крэкме Cruehead, он идет вместе с этим туториалом.
Так как это 32-х битный исполняемый файл, мы загрузим его в IDA для 32-х битных
файлов напрямую.
Если мы запустим крэкме вне IDA, мы увидим через Диспетчер Задач, что это 32-х битный процесс. Если мы хотим знать 32-х битный это или 64-х битный файл, без запуска, мы можем использовать 16-тиричный редактор. Например такой.
Загрузите и установите английскую версию
Самый простой способ — это открыть файл в хекс-редакторе, чтобы узнать какой он.
То, что мы видим — это Snipping Tools. И это 64-х битное приложение. Мы видим, что после слова PE есть следующие значения -> PE..d†
Наш крэкми — 32-х битный, после слова PE видим -> PE..L
Поэтому мы уже знаем какой мы файл имеем, чтобы загрузить его с использованием IDA 32. Когда IDA покажет окно QUICK START, мы выберем NEW, чтобы открыть новый файл, найдем наш крэкми и выберем его.
Сейчас не будем трогать настройки, потому что IDA правильно определила версию файла и мы можем нажать OK.
Если дальше нажмем YES на PROXIMITY VIEW, отобразиться дерево просмотра программы.
Чтобы перейти к графическому режиму или неграфическому — режиму инструкций нужно нажать пробел.
Также в OPTIONS — DEBUGGING OPTIONS — LINE PREFIXES мы можем добавить адреса в переднюю часть при графическом представлении.
Когда вы открываете исполняемый файл, первое, что открывается, это окно дизассемблера, которое называется LOADER, оно не запускает программу, а только ее анализирует для реверсинга и создает файл idb или базу данных (database).
Чтобы отладить программу мы должны выбрать среди всех доступных отладчиков включенных в IDA и запустить его в Режиме отладки, который мы разберем позже
Фундаментальные основы хакерства. Мастер-класс по анализу исполняемых файлов в IDA Pro
В этой статье мы окунемся в глубокий и подробный статический анализ с помощью IDA Pro — сверхпопулярного среди хакеров и специалистов по информационной безопасности дизассемблера. С первых же версий он занял заслуженное место лидера рынка. Это своего рода швейцарский армейский нож, которым мы будем разделывать цифровую добычу. Начнем с самого базового анализа и постепенно будем пробираться вперед, разгребая заросли кода.
Фундаментальные основы хакерства
Пятнадцать лет назад эпический труд Криса Касперски «Фундаментальные основы хакерства» был настольной книгой каждого начинающего исследователя в области компьютерной безопасности. Однако время идет, и знания, опубликованные Крисом, теряют актуальность. Редакторы «Хакера» попытались обновить этот объемный труд и перенести его из времен Windows 2000 и Visual Studio 6.0 во времена Windows 10 и Visual Studio 2019.
Ссылки на другие статьи из этого цикла ищи на странице автора.
С легкой руки Денниса Ритчи повелось начинать освоение нового языка программирования с создания простейшей программы «Hello, World!». Не будем нарушать эту традицию и оценим возможности IDA Pro следующим примером.
INFO
Чтобы все было как в статье, компилируй примеры с помощью Visual C++ 2017 вызовом cl.exe first.cpp /EHcs . Флаг /EHcs нужен, чтобы подавить возражение компилятора и вместе с тем включить семантику уничтожения объектов.
#include void main()
Компилятор сгенерирует исполняемый файл объемом почти 190 Кбайт, большую часть которого займет служебный, стартовый или библиотечный код. Попытка дизассемблирования с помощью таких средств, как W32Dasm, не увенчается быстрым успехом, поскольку над полученным листингом размером в два с половиной мегабайта (!) можно просидеть не час и не два. Легко представить, сколько времени уйдет на серьезные задачи, требующие изучения десятков и сотен мегабайтов дизассемблированного текста.
Попробуем дизассемблировать эту программу с помощью IDA. Если все настройки оставить по умолчанию, то после завершения анализа экран должен выглядеть следующим образом.
Чтобы открыть текстовое представление, надо из контекстного меню выбрать пункт Text view.
Какую версию IDA Pro выбрать?
Последней версией IDA Pro на момент написания статьи была 7.3. Ее цена может быть великовата для покупки в исследовательских целях. Как известно, Ильфак Гильфанов очень строго относится к утечкам и появлению продуктов своей компании в интернете и не допускает подобного.
Однако на сайте компании Hex-Rays в публичный доступ выложена бесплатная версия дизассемблера с функциональными ограничениями. Например, она не получает обновления после достижения майлстоуна целой версии, то есть сейчас для свободной загрузки доступна версия 7.0. Также она поддерживает только архитектуры x86 и x64.
Тем не менее этого вполне достаточно для наших целей. Потому что нам не придется разбираться в коде для процессоров ARM, Motorola, Sparc, MIPS или Zilog. Еще одно ограничение накладывается на использование в коммерческих целях, но и тут наша совесть чиста.
Закончив автоматический анализ файла first.exe , IDA переместит курсор к строке .text:0040628B — точке входа в программу. Не забудь из графического режима отображения листинга переключиться в текстовый. Также обрати внимание на строчку .text:00406290 start endp ; sp-analysis failed , выделенную красным цветом в конце функции start . Так IDA отмечает последнюю строку функции в случае, если у нее в конце return и значение указателя стека на выходе из функции отличается от такового на входе.
Среди начинающих программистов широко распространено заблуждение, что якобы программы, написанные на языке С, начинают выполняться с функции main . В действительности это не совсем так. На самом деле сразу после загрузки файла управление передается на функцию Start , вставленную компилятором. Она подготавливает глобальные переменные:
- argc — количество аргументов командной строки;
- argv — массив указателей на строки аргументов;
- _environ — массив указателей на строки переменных окружения.
Заполняется структура OSVERSIONINFOEX , которая среди прочего включает:
- dwBuildNumber — билд;
- dwMajorVersion — старшую версию операционной системы;
- dwMinorVersion — младшую версию операционной системы;
- _winver — полную версию операционной системы;
- wServicePackMajor — старшую версию пакета обновления;
- wServicePackMinor — младшую версию пакета обновления.
Далее Start инициализирует кучу (heap) и вызывает функцию main, а после возвращения управления завершает процесс с помощью функции Exit . Для получения значений структуры OSVERSIONINFOEX используется функция GetVersionEx .
Продемонстрировать инициализацию переменных, совершаемую стартовым кодом, а также получение их значений позволяет следующая программа.
CRtO.demo.c
#include #include #include void main() < OSVERSIONINFOEX osvi; ZeroMemory( osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((OSVERSIONINFO*) int a; printf(«>OS Version:ttt%d.%dn >Build:ttt%dn >Arguments count:t%dn», osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwOSVersionInfoSize, __argc); for (a = 0; a < __argc; a++) printf(«>t Argument %02d:tt%sn», a + 1, __argv[a]); a = !a — 1; while (_environ[++a]); printf(«>Environment variables count:%dn», a); while (a) printf(«>tVariable %d:tt%sn», a, _environ[—a]); >
Прототип функции main как будто указывает, что приложение не принимает никаких аргументов командной строки, но результат работы программы говорит об обратном и на моей машине выглядит так (приводится в сокращенном виде):
OS Version: 6.2
Build: 156
Arguments count: 1
Argument 01: CRt0.demo.exe
Environment variables count: 99
.
Variable 20: FrameworkVersion=v4.0.30319
Variable 19: FrameworkDIR32=C:WINDOWSMicrosoft.NETFramework
Variable 18: FrameworkDir=C:WINDOWSMicrosoft.NETFramework
Variable 17: Framework40Version=v4.0
Variable 16: ExtensionSdkDir=C:Program Files (x86)Microsoft SDKsWindows Kits10ExtensionSDKs
Variable 15: DriverData=C:WindowsSystem32DriversDriverData
Очевидно, нет никакой необходимости анализировать стандартный стартовый код приложения, и первая задача исследователя — найти место передачи управления на функцию main . К сожалению, чтобы гарантированно решить эту задачу, потребуется полный анализ содержимого функции Start . У исследователей есть много хитростей, которые позволяют не делать этого, но все они базируются на особенностях реализации конкретных компиляторов и не могут считаться универсальными.
Например, Visual C++ всегда, независимо от прототипа функции main , передает ей три аргумента: указатель на массив указателей переменных окружения, указатель на массив указателей аргументов командной строки и количество аргументов командной строки, а все остальные функции стартового кода принимают меньшее количество аргументов.
Рекомендую ознакомиться с исходниками стартовых функций популярных компиляторов. Для Visual C++ 14 в соответствии с архитектурой они находятся в подпапках каталога %Program Files (x86)Microsoft Visual Studio 14.0VCcrtsrc . Их изучение упростит анализ дизассемблерного листинга.
Ниже в качестве иллюстрации приводится фрагмент стартового кода программы first.exe , полученный в результате работы W32Dasm.
//******************** Program Entry Point ********************
:0040628B E802070000 call 00406992
:00406290 E974FEFFFF jmp 00406109
* Referenced by a CALL at Addresses:
|:0040380C , :004038B2 , :0040392E , :00403977 , :00403A8E
|:00404094 , :004040FA , :00404262 , :00404BF4 , :00405937
|:004059AE
|
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004062B6(U)
|
:00406295 8B4DF4 mov ecx, dword ptr [ebp-0C]
:00406298 64890D00000000 mov dword ptr fs:[00000000], ecx
:0040629F 59 pop ecx
:004062A0 5F pop edi
:004062A1 5F pop edi
:004062A2 5E pop esi
:004062A3 5B pop ebx
:004062A4 8BE5 mov esp, ebp
:004062A6 5D pop ebp
:004062A7 51 push ecx
:004062A8 F2 repnz
:004062A9 C3 ret
.
Иначе выглядит результат работы IDA, умеющей распознавать библиотечные функции по их сигнатурам (приблизительно по такому же алгоритму работает множество антивирусов).
Поэтому способности дизассемблера тесно связаны с его версией и полнотой комплекта поставки — далеко не все версии IDA Pro в состоянии работать с программами, сгенерированными современными компиляторами.
.text:0040628B start proc near
.text:0040628B
.text:0040628B ; FUNCTION CHUNK AT .text:00406109 SIZE 00000127 BYTES
.text:0040628B ; FUNCTION CHUNK AT .text:00406265 SIZE 00000026 BYTES
.text:0040628B
.text:0040628B call sub_406992
.text:00406290 jmp loc_406109
.text:00406290 start endp ; sp-analysis failed
.text:00406290
.text:00406295 ; [00000015 BYTES: COLLAPSED FUNCTION __EH_epilog3. PRESS CTRL-NUMPAD+ TO EXPAND]
.text:004062AA ; [00000011 BYTES: COLLAPSED FUNCTION __EH_epilog3_GS. PRESS CTRL-NUMPAD+ TO EXPAND]
.text:004062BB ; [00000034 BYTES: COLLAPSED FUNCTION __EH_prolog3. PRESS CTRL-NUMPAD+ TO EXPAND]
.text:004062EF ; [00000037 BYTES: COLLAPSED FUNCTION __EH_prolog3_GS. PRESS CTRL-NUMPAD+ TO EXPAND]
.text:00406326 ; [00000037 BYTES: COLLAPSED FUNCTION __EH_prolog3_catch. PRESS CTRL-NUMPAD+ TO EXPAND]
.text:0040635D
.text:0040635D ; =============== S U B R O U T I N E ===============
.text:0040635D
.text:0040635D ; Attributes: thunk
.text:0040635D
.text:0040635D sub_40635D proc near ; CODE XREF: sub_4042FD+19↑p
.text:0040635D jmp sub_406745
.text:0040635D sub_40635D endp
.text:0040635D
.text:00406362
.
Перечень поддерживаемых компиляторов можно найти в файле %IDA%/SIG/list . В нем есть старинные Microsoft C и Quick C, Visual C++ с первой по восьмую версию и Visual.Net. А вот Visual C++ 14 из Visual Studio 2017 здесь нет. Однако, взглянув в окно IDA, мы видим, что дизассемблер сумел определить многие (но не все) функции.
Заглянем в окно вывода, находящееся внизу. Там, немного прокрутив вывод, мы обнаружим строчку Using FLIRT signature: SEH for vc7-14 , говорящую о том, что используемая версия IDA все же понимает компиляторы Visual C++ от 7 до 14.
Давай разбираться в получившемся листинге. Первое и в данном случае единственное, что нам надо найти, — это функция main . В начале стартового кода после выполнения процедуры sub_406992 программа совершает прыжок на метку loc_406109 :
.text:0040628B start proc near
.text:0040628B call sub_406992
.text:00406290 jmp loc_406109
Для перехода на метку достаточно поставить на нее текстовый курсор и нажать Enter. Если подвести курсор мыши к метке или вызову функции, появится окно, в котором будет показано начало выбранной функции или место листинга, куда переводит метка, что очень удобно.
В данном случае, как мы видим по комментарию, IDA отправила нас в начало стартового куска кода. Немного прокрутим листинг вниз, обращая внимание на плавные переходы по меткам.
В итоге доходим до вызова функции: call sub_4010D0 . Похоже, это и есть функция main , поскольку здесь дизассемблер смог распознать строковую переменную и дал ей осмысленное имя aHelloSailor , а в комментарии, расположенном справа, для наглядности привел оригинальное содержимое Hello, Sailor!n . Смещение этой строки компилятор закинул на вершину стека, а затем ниже через строчку, по всей видимости, происходит вызов функции вывода на экран:
.text:004010D3 push offset aHelloSailor ; «Hello, Sailor!n»
.text:004010D8 push offset unk_42DE30
.text:004010DD call sub_401170
Чтобы убедиться в этом, зайдем в последнюю процедуру. Разобраться в ней без пива не представляется возможным, разве что огромное количество параметров намекает нам на схожесть с функцией printf .
Если поместить курсор в границы имени aHelloSailor и нажать Enter, IDA автоматически перейдет к строке, в которой выполняется определение переменной:
.rdata:0041E1A0 aHelloSailor db ‘Hello, Sailor!’,0Ah,0 ; DATA XREF: sub_4010D0+3↑o
Выражение DATA XREF: sub_4010D0+3↑o называется перекрестной ссылкой и свидетельствует о том, что в третьей строке процедуры sub_4010D0 произошло обращение к текущему адресу по его смещению ( o от слова offset), а стрелка, направленная вверх, указывает на относительное расположение источника перекрестной ссылки.
Если навести курсор на выражение sub_4010D0+3↑o и нажать Enter, то IDA Pro перейдет к следующей строке:
.text:004010D3 push offset aHelloSailor ; «Hello, Sailor!n»
Нажатие Esc отменяет предыдущее перемещение, возвращая курсор в исходную позицию.
К слову, дизассемблер W32Dasm даже не смог распознать строковую переменную.
Что не так с IDA?
Положа руку на сердце — я был слегка разочарован, ибо ожидал, что IDA распознает больше библиотечных процедур. Поэтому я решил натравить «Иду» на такую же программу, но сгенерированную более ранней версией компилятора. Подопытным кроликом выступил Visual C++ 8.0 (VS 2005).
Сравним результаты работы компиляторов. Тот же исходник, компиляция из командной строки (папка first05 ). Загрузим итоговый экзешник в «Иду». Листинг приводится в сокращенном виде для экономии пространства.
Мало того что стартовый код меньше по объему, так еще было автоматически определено большее количество библиотечных функций, среди которых: GetVersionExA, GetProcessHeap, HeapFree и ряд других. Среди них достаточно просто найти вызов main и перейти на саму функцию.
Тем не менее VC++ 8.0 — ушедшая эпоха, и в пример я ее привел только для ознакомления.
На этом анализ приложения first.cpp можно считать завершенным. Для полноты картины остается переименовать функцию sub_4010D0 в main . Для этого подводи курсор к строке .text:004010D0 (началу функции) и жми N. В появившемся диалоге можешь ввести main . Результат должен выглядеть так:
.text:004010D0 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:004010D0 main proc near ; CODE XREF: start-8D↓p
.text:004010D0
.text:004010D0 argc = dword ptr 8
.text:004010D0 argv = dword ptr 0Ch
.text:004010D0 envp = dword ptr 10h
.text:004010D0
.text:004010D0 push ebp
.text:004010D1 mov ebp, esp
.text:004010D3 push offset aHelloSailor ; «Hello, Sailor!n»
.text:004010D8 push offset unk_42DE30
.text:004010DD call sub_401170
.text:004010E2 add esp, 8
.text:004010E5 xor eax, eax
.text:004010E7 pop ebp
.text:004010E8 retn
.text:004010E8 main endp
Обрати внимание: IDA в комментарии подставила прототип функции, а ниже параметры по умолчанию.
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Крис Касперски
Известный российский хакер. Легенда ][, ex-редактор ВЗЛОМа. Также известен под псевдонимами мыщъх, nezumi (яп. 鼠, мышь), n2k, elraton, souriz, tikus, muss, farah, jardon, KPNC.
Юрий Язев
Широко известен под псевдонимом yurembo. Программист, разработчик видеоигр, независимый исследователь. Старый автор журнала «Хакер».
Источник: xakep.ru
Встроенный язык ida Pro
С помощью встроенного языка программирования (упрощенный язык С) можно писать небольшие программы анализа дизассемблированного кода.
Существует два способа выполнения команд на языке IDC. Вызвать окно комбинацией клавиш Shift+F2. В окне можно набирать команды и после нажатия OK они выполнятся.
Рис. Окно встроенного языка IDC
Результат выполнения команды Message(«Engecon!»);
Рис. Результат выполнения команды IDC
Второй подход – более основательный, создание файлов с расширением idc и их запуск.
Рис. Меню выбора открытия файлов IDC
В папке idc есть несколько примеров подобных скриптов.
Плагины ida Pro
Благодаря плагинам, написанным на С++ функционал IDA Pro можно расширить.
Обзор плагинов для IDA Pro (можно скачать без регистрации): http://www.openrce.org/downloads/browse/IDA_Plugins
Одним из плагинов для IDA Pro является декомпилятор HexRays, который переводит двоичный код в «С-подобный».
Литература для дополнительного изучения
- Ассемблер и дизассемблирование. Владислав Пирогов.
- The IDA Pro Book: The Unofficial Guide to the World’s Most Popular Disassembler, Chris Eagle http://www.idabook.com/
- «Образ мышления – дизассемблер IDA», К.Касперски. За основу книги взята версия IDA Pro 4.01, а уже вышла версия 6.1. Много примеров скриптов на языке IDC.
- Фундаментальные основы хакерства. Искусство дизассемблирование. К.Касперски.
Задание для самостоятельного выполнения
Лабораторную работу можно выполнять по два человека, но будет оцениваться вклад каждого. Разработать консольное приложение на Visual C++ или на чистом ассемблере, запрашивающее строковый пароль. В случае правильно введенного пароля – выводится строка: «True password», иначе – строка «Wrong password». Ввод пароля ограничен тремя попытками.
Исходный текст с комментариями к программе необходимо приложить к отчету в качестве Приложения 1. Первая версия приложения не должна содержать какой-либо защиты от отладчиков и дизассемблеров, т.е. пароль можно хранить в открытом виде. Затем необходимо исследовать (Release-версию) программу в отладчике/дизассемблере и обойти механизм ввода пароля.
Все шаги необходимо отразить в отчете в виде скриншотов (комментариев, листингов). Затем необходимо реализовать несколько методов (например, через ассемблерные вставки или на чистом ассемблере) защиты программы от исследования с помощью отладчика/дизассемблера.
Исходный код с комментариями к обновленной программе (важны комментарии к добавленным средствам защиты) необходимо приложить к отчету в качестве Приложения 2. Проверить на отладчике/дизассемблере работу внедренных средств защиты. В отчете необходимо отразить скиншоты с комментариями и дизассемблированный код (листинг). Выводы по проделанной работе. Дополнительные баллы можно получить, реализовав оконныеприложения с несколькими видами защит от исследования.
Список используемой литературы
- Реверсинг и защита программ от взлома. Александр Панов.
- Ассемблер и дизассемблирование. Владислав Пирогов.
- Введение в крэкинг с нуля, используя OllyDbg. Рикардо Нарваха, пер. Aquila, http://wasm.ru
- Отладка без исходных текстов. К.Касперски. Скачать книгу: http://www.insidepro.com/kk/170/170r.rar
Источник: studfile.net