• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

🖐 Приветствую всех читателей Codeby.net 🖐

Это продолжение статьи "Reverse crackme для начинающих". В этой статье мы разберёмся, как узнать верный пароль для прохождения простого .
Рекомендую , а затем читать статьи про реверс-инжиниринг. Вам будет понятнее.

1620394145110.png



Нам понадобятся:

  • Интерактивный дизассемблер IDA
  • или ( инструменты для статического исследования файлов )

Осмотр crackme

Открываем crackme в PPEE или PEstudio. Нам необходимо узнать разрядность crackme. Затем, открыть в нужной версии IDA ( x64 или x86 ).

Pestudio.png


PPEE.png


Мы узнали, что разрядность этого crackme - x86.

Запустим и изучим его.

Нажимая на кнопку File, появляется Exit.

CR_EXIT.png


Нажимая на кнопку Help, мы видим Enter Password и About. Нажмём на Enter Password и видим одно поле ввода для пароля.

CR_HELP.png


CR_ENTER.png


При вводе неправильного пароля, появляется надпись "No luck there, mate!".

CR_NO_LUCK.png


Изучаем crackme в IDA


В видео будут отображаться нажатые клавиши. В IDA для переключения в режим графом, нажмите "пробел".


Откроем IDA, выберем crackme. Далее переходим в View -> Strings. Ищем строку "No luck there, mate!" или "Good work!". Переходим по перекрёстной ссылке и поменяем название функции на "good_work" или "no_luck". Переходим в то место, где используются эти функции.


Поставим точку останова на инструкции по адресу 0x401228. Выберем "Local windows debugger". Запустим отладчик и введём любой пароль. Точка остановки сработала. Посмотрим, что находится по смещению "String". Там находиться массив символов. Его длина 0x20 ( 32 ) байт. Там находиться наш введённый пароль. Поменяем название "String" на "KEY".
Теперь, переходим в функцию sub_401365. Внутри этой функции находиться цикл, который проверяет каждый символ в пароле и узнаёт его длину. Если код буквы больше или равен 0x5A, то из этого кода вычитается 0x20 ( функция Sub_20 ). Например: 0x65 ( e ) - 0x20 = 0x45 ( E ). Поменяем название функции sub_401365 на check_symbol.

IDA_Check_letter.png


После проверки каждой буквы и окончания цикла, вызывается функция sub_401399.

Код:
       Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
       ────────────────────────────────────────────────────────────────────────
       000   0     00    NUL '\0' (null character)   100   64    40    @
       001   1     01    SOH (start of heading)      101   65    41    A
       002   2     02    STX (start of text)         102   66    42    B
       003   3     03    ETX (end of text)           103   67    43    C
       004   4     04    EOT (end of transmission)   104   68    44    D
       005   5     05    ENQ (enquiry)               105   69    45    E
       006   6     06    ACK (acknowledge)           106   70    46    F
       007   7     07    BEL '\a' (bell)             107   71    47    G
       010   8     08    BS  '\b' (backspace)        110   72    48    H
       011   9     09    HT  '\t' (horizontal tab)   111   73    49    I
       012   10    0A    LF  '\n' (new line)         112   74    4A    J
       013   11    0B    VT  '\v' (vertical tab)     113   75    4B    K
       014   12    0C    FF  '\f' (form feed)        114   76    4C    L
       015   13    0D    CR  '\r' (carriage ret)     115   77    4D    M
       016   14    0E    SO  (shift out)             116   78    4E    N
       017   15    0F    SI  (shift in)              117   79    4F    O
       020   16    10    DLE (data link escape)      120   80    50    P
       021   17    11    DC1 (device control 1)      121   81    51    Q
       022   18    12    DC2 (device control 2)      122   82    52    R
       023   19    13    DC3 (device control 3)      123   83    53    S
       024   20    14    DC4 (device control 4)      124   84    54    T
       025   21    15    NAK (negative ack.)         125   85    55    U
       026   22    16    SYN (synchronous idle)      126   86    56    V
       027   23    17    ETB (end of trans. blk)     127   87    57    W
       030   24    18    CAN (cancel)                130   88    58    X
       031   25    19    EM  (end of medium)         131   89    59    Y
       032   26    1A    SUB (substitute)            132   90    5A    Z
       033   27    1B    ESC (escape)                133   91    5B    [
       034   28    1C    FS  (file separator)        134   92    5C    \  '\\'
       035   29    1D    GS  (group separator)       135   93    5D    ]
       036   30    1E    RS  (record separator)      136   94    5E    ^
       037   31    1F    US  (unit separator)        137   95    5F    _
       040   32    20    SPACE                       140   96    60    `
       041   33    21    !                           141   97    61    a
       042   34    22    "                           142   98    62    b
       043   35    23    #                           143   99    63    c
       044   36    24    $                           144   100   64    d
       045   37    25    %                           145   101   65    e
       046   38    26    &                           146   102   66    f
       047   39    27    '                           147   103   67    g
       050   40    28    (                           150   104   68    h
       051   41    29    )                           151   105   69    i
       052   42    2A    *                           152   106   6A    j
       053   43    2B    +                           153   107   6B    k
       054   44    2C    ,                           154   108   6C    l
       055   45    2D    -                           155   109   6D    m
       056   46    2E    .                           156   110   6E    n
       057   47    2F    /                           157   111   6F    o

       060   48    30    0                           160   112   70    p
       061   49    31    1                           161   113   71    q
       062   50    32    2                           162   114   72    r
       063   51    33    3                           163   115   73    s
       064   52    34    4                           164   116   74    t
       065   53    35    5                           165   117   75    u
       066   54    36    6                           166   118   76    v
       067   55    37    7                           167   119   77    w
       070   56    38    8                           170   120   78    x
       071   57    39    9                           171   121   79    y
       072   58    3A    :                           172   122   7A    z
       073   59    3B    ;                           173   123   7B    {
       074   60    3C    <                           174   124   7C    |
       075   61    3D    =                           175   125   7D    }
       076   62    3E    >                           176   126   7E    ~
       077   63    3F    ?                           177   127   7F    DEL

В функции sub_401399 происходит операция xor между символами пароля и символами строки Messing_in_bytes. Результат этой операции перезаписывает пароль на новый. Например: xor KEKC ( 0x4B 0x45 0x4B 0x43) и фрагмента строки Mess ( 0x4D 0x65 0x73 0x73 ) даёт байты 0x6 0x20 0x38 0x30.
Mess от строки Messing_in_bytes. Взято 4 символа от строки для операции xor, так как длина введённого пароля 4 символа.

IDA_XOR.png


Поменяем название функции sub_401399 на xor_key_messing.


Переходим к функции sub_4013B8. Ей передаётся отредактированный пароль. Эта функция сравнивает каждый символ пароля и содержимого в unk_402150. От этого сравнения зависит поведение программы ( выполниться функция good_work или no_luck ). Следовательно, unk_402150 можно переименовать в correct_key, а функцию sub_4013B8 в check_key.

IDA_Check_unk_key.png


Содержимое в unk_402150 похоже на пароль после операции xor со строкой Messing_in_bytes.

Результат операции xor можно вернуть в изначальный вид.
Например:

Код:
5A xor 3B = 61
61 xor 5A = 3B
61 xor 3B = 6A

Узнаём верный пароль


Напишем скрипт на Python, который выполнит операцию xor для данных из unk_402150 и выдаст нам правильный пароль для ввода в программу.

Python:
#!/usr/bin/python3

CORRECT_KEY = '\x1F\x2C\x37\x36\x3B\x3D\x28\x19\x3D\x26\x1A\x31\x2D\x3B\x37\x3E' # Правильный пароль в байтах из unk_402150
XOR_WORD = "Messing_in_bytes" # Строка для операции xor с паролем

def generate_key():
    NEW_KEY = "" # Строка с паролем после xor'a
    NEW_KEY_2 = "" # Строка с финальным вариантом пароля
  
    for i in range(0, len(CORRECT_KEY)): # Цикл for для каждого символа пароля
        # Выполняется xor для кода каждого символа (функция ord) между паролем и строкой Messing_in_bytes
        # Далее результат записывается в виде буквы (функция chr)
        NEW_KEY += chr( ord(CORRECT_KEY[i] ) ^ ord( XOR_WORD[i] ) )
  
    for i in range(0, len(NEW_KEY)): # Цикл for для каждого символа пароля
        # Если код символа больше или равен 0x5A (Z), то из него вычитается 0x20
        if NEW_KEY[i] > 'Z':
            NEW_KEY_2 += chr(ord(NEW_KEY[i]) - 0x20)
        # Если код символа меньше 0x5A, то изменений с символом пароля не происходит.
        # Пароль переносится в новую строку с финальным вариантом.
        else:
            NEW_KEY_2 += NEW_KEY[i]
    print("KEY ----> " + NEW_KEY_2 + " <---- KEY") # Печатаем пароль

if __name__ == '__main__':
    generate_key()

Пароль: RIDERSOFTHESTORM

Проверка пароля:



Мы узнали верный пароль для этого crackme. :)
 
Последнее редактирование:

nks1ck

Green Team
02.11.2020
223
106
BIT
0
С видосами все намного удобнее и понятнее стало. Благодарю.
 
  • Нравится
Реакции: Mogen

.Method

Grey Team
17.12.2018
255
63
BIT
0
Разбор хороший.
Но немое видео и по частям в обнимку с текстовым объяснением.

Не знаю, как остальным, но мне хуже заходит.

Тут уж видео полностью и с объяснением либо текстовый гайд.
 
  • Нравится
Реакции: Mogen

Mogen

Red Team
27.08.2019
314
610
BIT
5
Разбор хороший.
Но немое видео и по частям в обнимку с текстовым объяснением.

Не знаю, как остальным, но мне хуже заходит.

Тут уж видео полностью и с объяснением либо текстовый гайд.
Ок. Подумаю, что можно сделать.
 
  • Нравится
Реакции: .Method
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!