В семестре у нас проводились лекции от каспера по различным вопросам связанным с вредоносными программами. Естественно, что нам также рассказывали о реверсинге и давали задания на эту тему. Итак,задания: задание №1 (вводное в реверсинг) 1. Содержит ли каждый файл с PE – заголовком DOS – заголовок (MZ)? Если да - каким образом это используется? 2. Каким образом можно определить тип заголовка – 32 – битный или 64 – битный? 3. Почему приложение 1.exe ведёт себя нестабильно при запуске, а 2.exe не запускается? Напишите предположение о причине. 4. Исправьте файл 3.exe таким образом, чтобы он корректно запускался и завершался. Отразите и поясните все изменения. 5. Каким образом можно получить управление в файле, перед вызовом кода, расположенного по точке входа? 6. Выясните причину некорректной работы 4.exe и исправьте её. Aрхив: http://rghost.ru/1937645 ================================================ задание №2 задание состоит из трех программ CrackMe разной степени сложности. Задача - разобрать алгоритм проверки, выполняемой программой и подобрать серийный ключ. Ответом на задание должены быть алгоритм создания ключа и пример ключа. архив: http://rghost.ru/1937424 ================================================ задание №3 Задания (файлы в приложенном архиве): 1) Распаковать исполнимый файл. Решение присылать в таком виде: распакованный работающий файл, название пакера, которым он был упакован, пара слов о том, как распаковали. Архив: http://rghost.ru/1937667 2) Пропатчить исполнимый файл так, чтобы при его запуске показывалось сообщение (MessageBox) о том, кем он был пропатчен (e-mail). Остальной функционал должен остаться прежним. Архив: http://rghost.ru/1937677 3) От исполнимого файла отрезали заголовок (DOS-заголовок, PE-заголовок и таблицу секций). Требуется добавить заголовок, чтобы файл стал работающим. Архив: http://rghost.ru/1937681 4) Создать исполнимый файл без секций (IMAGE_NT_HEADERS::FileHeader::NumberOfSections = 0), при запуске показывающий сообщение с e-mail'ом создателя. Примечание: в именах файлов к заданиям 2 и 3 показан уровень сложности (1 - самый легкий). ================================= Учебные материалы: 1)"Microsoft Portable Executable and Common Object File Format Specification" - http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/pecoff_v8.docx 2)"Формат исполняемых файлов PE" - http://cracklab.ru/art/?action=view&id=146 3)"Распаковка: от самого простого к чуть более сложному" - http://cracklab.ru/art/?action=view&id=206 4)"Общие аспекты паковки/распаковки программ" - http://cracklab.ru/art/?action=view&id=145 5)Путь воина - внедрение в pe/coff http://www.insidepro.com/kk/019/019r.shtml Инструментарий: 1) Hiew - http://www.serje.net/sen/ 2) IDA (freeware) - http://www.hex-rays.com/idapro/idadownfreeware.htm 3) PETools - http://petools.org.ru/petools.shtml 4) ImpREC - http://www.tuts4you.com/request.php?415 5) OllyDbg - http://www.ollydbg.de/ 6) PEiD - http://cracklab.ru/_dl2/centner/122008/PEiD.v0.95[www.cracklab.ru].zip
Подправил первый пост, слил все задания в одно место, добавил учебные материалы и основной инструментарий
Задание #1 1. Содержит. Используется для определения смещения (от начала файла) на заголовок PE (e_lfanew). Так же содержит код-заглушку, который при запуске в ms-dos выводит сообщение типа "This program cannot be run in DOS mode" (иногда данный код может отсутствовать). 2. Если имеется в виду определить PE или PE32+ формат, то это можно сделать по полю Magic опционального заголовка (IMAGE_OPTONAL_HEADER32), для 32х разрядных файлов оно равно 0x10b, для 64х разрядных - 0x20b. Также в PE32+ некоторые поля расширены и убрано поле BaseOfData. 3. Причина заключается в некорректных значениях поля ImageBase в файлах. 2.exe не запускается из-за того, что значение ImageBase превышает максимальное допустимое для кода пользовательского режима. Для устранения проблемы необходимо исправить ImageBase, например, на 400000h и все будет работать. 4. e_lfanew изменить на 0x80h, Machine = 0x14ch, NumberOfSections = 3, SectionAlignment = 0x1000h, FileAlignment = 0x200h, выровнить файл до размера 65536 байт (дополнить последнюю секцию нулями), на точке входа поставить интсрукцию retn (0xc3h). 5. С помощью TLS callback функций. 6. Данный файл использует bound-импорт - об этом свидетельствуют установленные в -1 поля TimeDateStamp и ForwarderChain элементов массива таблицы импорта, а также наличие директории Bound Import. Причина некорректной работы приложения кроется в отсутствии имен модулей, на которые указывают поля OffsetModuleName элементов массива структур IMAGE_BOUND_IMPORT_DESCRIPTOR. Исправляется добавлением заканчивающихся нулем строк с именами модулей по смещению 0x298h (от начала файла) в следующем порядке - SHELL32.DLL, msvcrt.dll, ADVAPI32.DLL, KERNEL32.DLL, GDI32.DLL и USER32.DLL.
все правильно, в 4м задании можно не дополнять файл нулями, а подправить физические размеры секций. 5е задание действительно импорт, но что с ним не так?)
Выполнил пока что первый крякмис Алгоритм работы такой: 1. Вводится ключ такого типа xxxx-xxxx-xxxx-xxxx. 2. Идёт проверка на то, чтобы были введены только цифры. 3. Считается сумма ascii-кодов цифр каждой тетрады и из неё вычитается 192. 4. Считается среднее арифметическое из полученых чисел. 5. Сравнивается сумма одно тетрады со средним арифметическим. 6. Если равны, то происходит проверка на то, чтобы небыло одинаковых символов на одной и той же позиции в каждой тетраде. 7. Мы победили) пример ключа: 3456-6543-5364-4635
Задание №3 Часть 1 EP F8 ESP Register -> Follow in dump -> HBP on access JMP to OEP Delphi detected... Dump process Итого - делов на 1 минуту. packed_16_unpack.exe http://rghost.ru/1942221 Часть 2 1) Добавляем Import - LordPE 2) Свободное место было, поэтому пишемся в конец секции кода без добавления новой секции. В конце не забываем установить jmp на ep. 3) Меняем точку входа - выставляем смещение первой команды mbptc_level3_patched.exe http://rghost.ru/1942561
последний крякмис: destiny 1CE7A403 типа кейгенчик: Code: char *name="destiny"; char r8; unsigned r5 = 0x9C3B248E, r6 = 0xC1A7F39A; while (r8 = *name++){ r5 ^= r8; for (int i = 1; i <= 8; ++i){ if (r5 & 1) r5 = (r5 >> 1) ^ r6; else r5 = r5 >> 1; } } printf("%x\n", r5); getchar(); //кстати подозрительно похоже на дефолтную реализацию crc32 с нестандартными константами //add: разделанный пикод (осторожно, в нём попутаны hex и dec числа без обозначения): Code: 1: MOV reg0, name 2: MOV reg1, pass 3: MOV reg2, third ptr 4: MOV reg3, 0 5: MOV reg4, reg1 6: MOV reg5, reg2 7: reg6=*reg4++ 8: CMP reg6, reg3 9: JUMP TO 13 IF Z 10: reg6 |= 32 11: *reg5++=byte(reg6) 12: JUMP TO 7 IF Z NZ > < 13: *reg5++=byte(reg3) 14: MOV reg4, reg3 15: MOV reg5, reg2 16: reg6=*reg5++ 17: CMP reg6, reg3 18: JUMP TO 36 IF Z 19: CMP reg6, 30 20: JUMP TO 55 IF < 21: CMP reg6, 39 22: JUMP TO 30 IF > 23: reg6 -= 48 24: reg4 += reg4 25: reg4 += reg4 26: reg4 += reg4 27: reg4 += reg4 28: reg4 += reg6 29: JUMP TO 16 IF Z NZ > < 30: CMP reg6, 61 31: JUMP TO 55 IF < 32: CMP reg6, 66 33: JUMP TO 55 IF > 34: reg6 -= 87 35: JUMP TO 24 IF Z NZ > < 36: MOV reg5, 9C3B248E 37: MOV reg6, C1A7F39A 38: MOV reg7, reg0 39: reg8=*reg7++ 40: CMP reg8, reg3 41: JUMP TO 51 IF Z 42: reg5 ^= reg8 43: MOV reg9, 8 44: BT reg5.bits[0], reg5 >>= 1 45: JUMP TO 47 IF NZ 46: reg5 ^= reg6 47: reg9 -= 1 48: CMP reg9, reg3 49: JUMP TO 44 IF NZ 50: JUMP TO 39 IF Z NZ > < 51: CMP reg4, reg5 52: JUMP TO 55 IF NZ 53: MOV reg0, 1 54: JUMP TO 57 IF Z NZ > < 55: MOV reg0, 0 56: JUMP TO 57 IF Z NZ > < 57: MOV reg4, reg2 58: MOV reg5, 10 59: *reg4++=byte(reg3) 60: reg5 -= 1 61: CMP reg5, reg3 62: JUMP TO 59 IF NZ 63: return reg0
Буду по чуть-чуть его делать... Итак packed01.exe: PHP: В первом коле(00405007) ищем инструкцию POPFD(00405120), ставим breakpoint на команду RETN (00405121) под найденным POPFD и на третий остонов жмем StepInto. OEP: 00401466 Пакована: хз чем Распакованный: http://rghost.ru/1944026 Packed2.exe: PHP: Breakpoint на прыжок по адресу 00407CEB, после останова StepInto OEP: 00401630 Пакована: UPX 2.xx-3.xx, имена секций и информация о версии стерты(либо скрамблером, либо руками) Распакованный: http://rghost.ru/1944033 Packed3.exe: PHP: Breakpoint на прыжок по адресу 00407FBB, после останова StepInto OEP: 00401630 Пакована: ХЗ чем Распакованный: http://rghost.ru/1944042 Packed4.exe PHP: Пока пропущу, надо искать проверку ЦРЦ, т.к. файл пошатан Packed5.exe PHP: HardwareBreakpoint на EP(00401780) OEP: 00401780 Пакована: PECompact 2.xx Распакованный: http://rghost.ru/1944132 Packed6.exe PHP: Breakpoint на JMP EBX(00401F37) Пакована: ХЗ чем Распакованный: http://rghost.ru/1944136 Packed7.exe PHP: Breakpoint на JMP EСX(00407054) Пакована: DotFix Fake Signer или ХЗ чем Распакованный: http://rghost.ru/1944142 Packed8.exe PHP: Пока пропущу, надо искать проверку ЦРЦ, т.к. файл пошатан. То же самое что и в Packed4.exe Packed9.exe Как и в Packed1.exe PHP: В первом коле(0040A007) ищем инструкцию POPFD(0040A133), ставим breakpoint на команду RETN(0040A134) под найденным POPFD и на третий остонов жмем StepInto. OEP: 00401508 Пакована: хз чем Распакованный: http://rghost.ru/1944155 Packed10.exe PHP: Ищем вторую инструкцию POPFD(0040B18F), ставим breakpoint на прыжок(0040B190) под найденным POPFD, при останове жмем StepInto. OEP: 00401508 Пакована: NsPacK 3.хх Распакованный: http://rghost.ru/1944168 Packed11.exe PHP: Скролим листинг вниз до явного мусора, последняя нормальная команда 0040A334 -E9 1BD4FFFF JMP packed11.00407754. Ставим на нее breakpoint, при останове StepInto. Опять скролим вниз до мусора. Последняя нормальная команда 00407887 ^E9 7C9CFFFF JMP packed11.00401508 - это и есть прыг на ОЕР. Breakpoint, после останова StepInto. Пакер срет в импорт. Данные для восстановления в импреке: OEP: 001508 RVA: 001000 Size: 134 При восстановлении импорта первый байт на ЕР превращается в 0CCh(хз почему, даж не сморел), поэтому его правим на 068h и все работает Пакована: ХЗ чем Распакованный: http://rghost.ru/1944237 Packed12.exe PHP: Пакована: NsPacK 3.хх Распаковывается так же, как и Packed10.exe Распакованный: http://rghost.ru/1944247 Packed13.exe PHP: Так же, как и Packed5.exe HardwareBreakpoint на EP(004014FF) OEP: 004014FF Пакована: PECompact 2.xx Распакованный: http://rghost.ru/1944264 Packed14.exe: PHP: Так же как и Packed2.exe Breakpoint на прыжок по адресу 004639E8, после останова StepInto OEP: 0044E5E8 Пакована: UPX 2.xx-3.xx, информация о версии стертa(либо скрамблером, либо руками) Распакованный: http://rghost.ru/1944271 Packed15.exe: PHP: Ищем POPAD. Под 3м POPAD(00482E4F) ставим breakpoint на JMP(00482E50), после останова StepInto Пакована: ХЗ чем OEP: 0044E5E8 Распакованный: http://rghost.ru/1944280 Packed16.exe: PHP: Сколим вниз до нулей, находим конструкцию: 00460D66 C3 RETN 00460D67 -E9 C4D8FEFF JMP packed16.0044E630 Breakpoint на прыг, Stepinto после останова. Опять скроллим, находим: 0044E762 61 POPAD 0044E763 ^E9 80FEFFFF JMP packed16.0044E5E8 Breakpoint на прыг, Stepinto после останова. Пакована: ХЗ чем OEP: 0044E5E8 Распакованный: http://rghost.ru/1944299
mbptc_level1.exe: http://rghost.ru/1944355 mbptc_level2.exe: http://rghost.ru/1944444 mbptc_level3.exe: Сделал только для своей машины...тема больше VX'ерская...продолжаю курить бамбук - Чувствую не светит мне решить эту гадость под 7й вендой...получается только получить базовый адрес kernelbase, a вот как kernel32 получить хз Кто сделает, поделитесь кодесом - Сделал путем добавления функции в импорт, но это не тру. http://rghost.ru/1944802 Все еще хочу увидеть, как сделать через kernelbase
на самом деле в этих трех сэмплах уже есть нужные функции вывода сообщений, в первом winapi, во втором crt, в третьем mfc, учитывая это задача - тривиальна
Я просто не кодю на с++, поєтому с крт и мфц сталкивался только под отладчиком... Сталобыть нужно всего-лишь скомпилировать болванку с мессаджем под мфц и глянуть номер вызываемой функции и передаваемые параметры. Тогда не интересно и смысл в лєвєлах вообще отсутствует =/ - Честно говоря ожидал большего. Интерес представляет только задание, где нужно прикрутить хидер к секциям
Выполнил крякмис №2 Долго всё расписывать, так что просто расскажу что такое ключ - это маршрут шахматного коня, проходящего через все поля доски по одному разу для доски 8х8. Сам ключ: Code: 49229A6047585A2A106148216A3A46572350638A59441A4A62112051AA7A56451324393219524330363312274031185525143538531629423437261528415417
я тоже с црт и мфц не сталкивался даже в отладчиках, просто представляю что это такое, ну ладно в первой прожке месадж бокс в импортах висит, во второй я увидел наличие в импортах LoadLib и getProcAdr, залез посмотреть в иду на параметры, в то место где это используется, и увидел, что там crt_messagebox реализована прям в теле программы, в третьем я сразу полез в иду и начал поиск в импорте по словам схожим с message, найдя что-то похожее, полез в мсдн, узнал как использовать и что это мфцшная функция, так что даже ничего не зная можно выпутаться) зы. к тому же запустив приложения и потыкав на кнопочки, можно было таки понять что-там есть мессаджбоксы, но не совсем стандартные)
Ну в правилах небыло ничего сказанно про добавление секции и функции экспорта, поэтому мое решение тоже верное :Р
я же не говорю, что не верное, я тоже так хотел сделать вначале, но мне показалось это слишком геморным способом, хотелось чего-то сильно проще =)