Крякми от каспера

Discussion in 'Реверсинг' started by VERte][, 20 Jun 2010.

  1. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    В семестре у нас проводились лекции от каспера по различным вопросам связанным с вредоносными программами. Естественно, что нам также рассказывали о реверсинге и давали задания на эту тему.
    Итак,задания:

    задание №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 VERte][, 20 Jun 2010
    Last edited: 20 Jun 2010
    6 people like this.
  2. POS_troi

    POS_troi Elder - Старейшина

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    Кидай
     
  3. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    Подправил первый пост, слил все задания в одно место, добавил учебные материалы и основной инструментарий
     
  4. fluffylion

    fluffylion Member

    Joined:
    22 Feb 2010
    Messages:
    55
    Likes Received:
    10
    Reputations:
    0
    Задание #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 fluffylion, 20 Jun 2010
    Last edited: 21 Jun 2010
    1 person likes this.
  5. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    все правильно, в 4м задании можно не дополнять файл нулями, а подправить физические размеры секций. 5е задание действительно импорт, но что с ним не так?)
     
  6. slashd

    slashd Elder - Старейшина

    Joined:
    3 Sep 2008
    Messages:
    56
    Likes Received:
    15
    Reputations:
    6
    Выполнил пока что первый крякмис :)
    Алгоритм работы такой:
    1. Вводится ключ такого типа xxxx-xxxx-xxxx-xxxx.
    2. Идёт проверка на то, чтобы были введены только цифры.
    3. Считается сумма ascii-кодов цифр каждой тетрады и из неё вычитается 192.
    4. Считается среднее арифметическое из полученых чисел.
    5. Сравнивается сумма одно тетрады со средним арифметическим.
    6. Если равны, то происходит проверка на то, чтобы небыло одинаковых символов на одной и той же позиции в каждой тетраде.
    7. Мы победили)

    пример ключа: 3456-6543-5364-4635
     
    2 people like this.
  7. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    совершенно верно, следующие 2 крэкми сложнее, за третье я честно говоря даже не брался :)
     
  8. Dosia

    Dosia Member

    Joined:
    5 Jun 2009
    Messages:
    118
    Likes Received:
    81
    Reputations:
    6
    Задание №3

    Часть 1

    EP

    [​IMG]

    F8

    [​IMG]

    ESP Register -> Follow in dump -> HBP on access

    [​IMG]

    JMP to OEP

    [​IMG]

    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
     
    #8 Dosia, 20 Jun 2010
    Last edited: 21 Jun 2010
    1 person likes this.
  9. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    последний крякмис:
    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
    
     
    #9 desTiny, 21 Jun 2010
    Last edited: 21 Jun 2010
    1 person likes this.
  10. s0l_ir0n

    s0l_ir0n Active Member

    Joined:
    14 Mar 2009
    Messages:
    399
    Likes Received:
    144
    Reputations:
    18
    Буду по чуть-чуть его делать...
    Итак packed01.exe:
    PHP:
    В первом коле(00405007ищем инструкцию POPFD(00405120), ставим breakpoint на команду RETN

    (00405121под найденным POPFD и на третий остонов жмем StepInto.
    OEP00401466
    Пакована
    хз чем
    Распакованный
    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)
    OEP00401780
    Пакована
    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.
    OEP00401508
    Пакована
    хз чем
    Распакованный
    http://rghost.ru/1944155
    Packed10.exe
    PHP:
    Ищем вторую инструкцию POPFD(0040B18F), ставим breakpoint на прыжок(0040B190под найденным POPFDпри останове жмем StepInto.
    OEP00401508
    Пакована
    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.

    Пакер срет в импортДанные для восстановления в импреке:
    OEP001508
    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)
    OEP004014FF
    Пакована
    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
     
    #10 s0l_ir0n, 21 Jun 2010
    Last edited: 21 Jun 2010
    2 people like this.
  11. s0l_ir0n

    s0l_ir0n Active Member

    Joined:
    14 Mar 2009
    Messages:
    399
    Likes Received:
    144
    Reputations:
    18
    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
     
    #11 s0l_ir0n, 21 Jun 2010
    Last edited: 21 Jun 2010
  12. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    на самом деле в этих трех сэмплах уже есть нужные функции вывода сообщений, в первом winapi, во втором crt, в третьем mfc, учитывая это задача - тривиальна
     
  13. s0l_ir0n

    s0l_ir0n Active Member

    Joined:
    14 Mar 2009
    Messages:
    399
    Likes Received:
    144
    Reputations:
    18
    Я просто не кодю на с++, поєтому с крт и мфц сталкивался только под отладчиком...
    Сталобыть нужно всего-лишь скомпилировать болванку с мессаджем под мфц и глянуть номер вызываемой функции и передаваемые параметры. Тогда не интересно и смысл в лєвєлах вообще отсутствует =/
    -
    Честно говоря ожидал большего. Интерес представляет только задание, где нужно прикрутить хидер к секциям
     
  14. slashd

    slashd Elder - Старейшина

    Joined:
    3 Sep 2008
    Messages:
    56
    Likes Received:
    15
    Reputations:
    6
    Выполнил крякмис №2 :cool:
    Долго всё расписывать, так что просто расскажу что такое ключ - это маршрут шахматного коня, проходящего через все поля доски по одному разу для доски 8х8. Сам ключ:
    Code:
    49229A6047585A2A106148216A3A46572350638A59441A4A62112051AA7A56451324393219524330363312274031185525143538531629423437261528415417
     
    3 people like this.
  15. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    я тоже с црт и мфц не сталкивался даже в отладчиках, просто представляю что это такое, ну ладно в первой прожке месадж бокс в импортах висит, во второй я увидел наличие в импортах LoadLib и getProcAdr, залез посмотреть в иду на параметры, в то место где это используется, и увидел, что там crt_messagebox реализована прям в теле программы, в третьем я сразу полез в иду и начал поиск в импорте по словам схожим с message, найдя что-то похожее, полез в мсдн, узнал как использовать и что это мфцшная функция, так что даже ничего не зная можно выпутаться)

    зы. к тому же запустив приложения и потыкав на кнопочки, можно было таки понять что-там есть мессаджбоксы, но не совсем стандартные)
     
    #15 VERte][, 21 Jun 2010
    Last edited: 21 Jun 2010
  16. s0l_ir0n

    s0l_ir0n Active Member

    Joined:
    14 Mar 2009
    Messages:
    399
    Likes Received:
    144
    Reputations:
    18
    Ну в правилах небыло ничего сказанно про добавление секции и функции экспорта, поэтому мое решение тоже верное :Р
     
  17. VERte][

    VERte][ Elder - Старейшина

    Joined:
    17 May 2007
    Messages:
    240
    Likes Received:
    163
    Reputations:
    32
    я же не говорю, что не верное, я тоже так хотел сделать вначале, но мне показалось это слишком геморным способом, хотелось чего-то сильно проще =)