🖐 Приветствую всех читателей Codeby.net 🖐
Это продолжение статьи "Reverse crackme для начинающих". В этой статье мы разберёмся, как узнать верный пароль для прохождения простого
Рекомендую
Нам понадобятся:
Мы узнали, что разрядность этого crackme - x86.
Запустим и изучим его.
Нажимая на кнопку File, появляется Exit.
Нажимая на кнопку Help, мы видим Enter Password и About. Нажмём на Enter Password и видим одно поле ввода для пароля.
При вводе неправильного пароля, появляется надпись "No luck there, mate!".
В видео будут отображаться нажатые клавиши. В IDA для переключения в режим графом, нажмите "пробел".
Откроем IDA, выберем crackme. Далее переходим в View -> Strings. Ищем строку "No luck there, mate!" или "Good work!". Переходим по перекрёстной ссылке и поменяем название функции на "good_work" или "no_luck". Переходим в то место, где используются эти функции.
Поставим точку останова на инструкции по адресу
Теперь, переходим в функцию
После проверки каждой буквы и окончания цикла, вызывается функция
В функции
Mess от строки Messing_in_bytes. Взято 4 символа от строки для операции xor, так как длина введённого пароля 4 символа.
Поменяем название функции
Переходим к функции
Содержимое в
Результат операции xor можно вернуть в изначальный вид.
Например:
Напишем скрипт на Python, который выполнит операцию xor для данных из
Пароль:
Мы узнали верный пароль для этого crackme.
Это продолжение статьи "Reverse crackme для начинающих". В этой статье мы разберёмся, как узнать верный пароль для прохождения простого
Ссылка скрыта от гостей
. Рекомендую
Ссылка скрыта от гостей
, а затем читать статьи про реверс-инжиниринг. Вам будет понятнее.Нам понадобятся:
- Интерактивный дизассемблер IDA
-
Ссылка скрыта от гостей
-
Ссылка скрыта от гостейилиСсылка скрыта от гостей( инструменты для статического исследования файлов )
Осмотр crackme
Открываем crackme в PPEE или PEstudio. Нам необходимо узнать разрядность crackme. Затем, открыть в нужной версии IDA ( x64 или x86 ).Мы узнали, что разрядность этого crackme - x86.
Запустим и изучим его.
Нажимая на кнопку File, появляется Exit.
Нажимая на кнопку Help, мы видим Enter Password и About. Нажмём на Enter Password и видим одно поле ввода для пароля.
При вводе неправильного пароля, появляется надпись "No luck there, mate!".
Изучаем 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
.После проверки каждой буквы и окончания цикла, вызывается функция
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 символа.
Поменяем название функции
sub_401399
на xor_key_messing
.Переходим к функции
sub_4013B8
. Ей передаётся отредактированный пароль. Эта функция сравнивает каждый символ пароля и содержимого в unk_402150
. От этого сравнения зависит поведение программы ( выполниться функция good_work или no_luck ). Следовательно, unk_402150
можно переименовать в correct_key
, а функцию sub_4013B8
в check_key
.Содержимое в
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.
Последнее редактирование: