Консультация № 191566
28.10.2017, 13:24
0.00 руб.
1 10 1
Здравствуйте! Прошу помощи в следующем вопросе:
Подскажите пожалуйста, как правильно надо делать это задание? Прикрепляю отчет и саму программу. В отчете написано само задание и те действия докуда я смогла дойти. Я понимаю что нужно делать дальше, но мне кажется что у меня неправильно дальше срабатывает или даже вообще не срабатывает программа.
Прикрепленные файлы:
bb97f33bdad71276ed7e9534a094c7f803282689.rar

Обсуждение

давно
Старший Модератор
31795
6196
30.10.2017, 13:35
общий
Адресаты:
Цитата: ter4nastya
просматриваем эту область в дампе данных, видим коды символов пароля в 16-м виде (C1 D6 CA CE CB), осталось сделать с ними xor,25h в калькуляторе и посмотреть в таблице кодировок сами буквы пароля.

А в чем проблема, Вы уже получили пароль, декодируете и вводите, получаете:


Декодировать нужно по таблице Кодировка Windows-1251
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
30.10.2017, 13:47
общий
Адресаты:
Защиты такого типа хорошо описаны в книге К.Касперского. Я бы нацелился на код сравнения пароля:

и поставил там команду CMP BL,BL (или CMP DL,DL), пусть сама себя сравнивает, и чтобы Вы не ввели будет правильно.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
30.10.2017, 13:53
общий
Книга Касперски K. Техника и философия хакерских атак
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
30.10.2017, 18:32
общий
Адресаты:
Или Вы не поняли как получили правильный пароль?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401367
6
31.10.2017, 09:57
общий
Адресаты:
Да Вы правы, я не совсем поняла весь этот процесс.

Я даже пробовала делать так:
Открываю exe файл в программе, далее нажимаю комбинацию ctrl + n и нахожу в списке функцию GetWindowTextA, дважды щелкаю кнопкой мыши по этой функции и оказываемся в том месте где есть эта функция в коде. Сразу после этого ставлю точку останова, запускаю программу и начинаю кнопкой F8 проверять все строчки.
Моя проблема в том, что я хочу проверить строчку в которой написано CMP ESI, 7 , но я не могу на ней не точку останова поставить, не просмотреть ее. Меня почему-то перекидывает на другой блок сразу.

Я прикрепила скриншот и там пометила строчки 1 и 2. Когда я стою на строчке один и хочу попасть на выделенную желтым строчку, то меня перебрасывает на вторую строчку
Прикрепленные файлы:
92b4f8989b5ebe42a30a9574836f9bfc.JPG
давно
Старший Модератор
31795
6196
31.10.2017, 10:23
общий
Адресаты:
А Вам эта строчка и ненужна.

Проблема этой защиты, в том что она что-то вводит, раз вводит, значит есть адрес, куда введенная строка будет записана.
[code lang=asm].idata:004040B0 ; int __stdcall GetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount)
.idata:004040B0 extrn GetWindowTextA:dword ; CODE XREF: sub_401130+165p[/code]
В данном случае Вас должен интересовать второй параметр LPSTR lpString, это адрес куда будет записан введенный Вами пароль. Первый бряк должен поймать функцию ввода, смотрим адрес. Поставив бряк на чтение этого адреса(не на запись, т.к. можно попасть в дебри системной функции, а потом долго от туда выбираться). Отпускаем программу, срабатывание бряка даст сам механизм контроля пароля - наш пароль будет сравниваться с чем-то, вот это и есть правильный зашифрованный пароль.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
31.10.2017, 13:56
общий
Адресаты:
Займемся реверсом программы .

Это оконное приложение, которому для создания окна нужно регистрировать свой класс.
Запустив IDApro получаем следующий код:
[code lang=asm h=200]sub esp, 4Ch
push esi
mov esi, [esp+50h+hInstance]
push edi
mov edi, ds:LoadIconA
push 7F00h ; lpIconName
push 0 ; hInstance
mov [esp+5Ch+var_30.cbSize], 30h
mov [esp+5Ch+var_30.style], 3
mov [esp+5Ch+var_30.lpfnWndProc], offset sub_401130
mov [esp+5Ch+var_30.cbClsExtra], 0
mov [esp+5Ch+var_30.cbWndExtra], 0
mov [esp+5Ch+var_30.hInstance], esi
call edi ; LoadIconA
push 7F00h ; lpCursorName
push 0 ; hInstance
mov [esp+5Ch+var_30.hIcon], eax
call ds:LoadCursorA
push 0 ; i
mov [esp+58h+var_30.hCursor], eax
call ds:GetStockObject
push 7F00h ; lpIconName
push 0 ; hInstance
mov [esp+5Ch+var_30.hbrBackground], eax
mov [esp+5Ch+var_30.lpszMenuName], 0
mov [esp+5Ch+var_30.lpszClassName], offset Caption ; "PopPad1"
call edi ; LoadIconA
mov [esp+54h+var_30.hIconSm], eax
lea eax, [esp+54h+var_30]
push eax ; WNDCLASSEXA *
call ds:RegisterClassExA[/code]
Его аналогом есть код С(слизан с другого сайта):
Код:
  HWND hwnd; // дескриптор окна
MSG msg; // структура сообщения
WNDCLASS w; // структура класса окна
// Регистрация класса окна
memset(&w,0,sizeof(WNDCLASS));
w.style = CS_HREDRAW | CS_VREDRAW;
w.lpfnWndProc = WndProc; // имя оконной функции
w.hInstance = hInstance;
w.hbrBackground = (HBRUSH)(WHITE_BRUSH);
w.lpszClassName = "My Class";
RegisterClass(&w);


В коде интересным местом является оконная процедура определенная в строке
[code lang=asm]mov [esp+5Ch+var_30.lpfnWndProc], offset sub_401130[/code]
Именно она будет обслуживать созданное окно, обрабатывая все его события.
Код:
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
switch (Message)
{
case WM_Event://событие, которое обрабатывает оконная процедура
//далее подстановка из кода
mov eax, hWnd
push ebx ; nMaxCount
push edi ; lpString
push eax ; hWnd
call ds:GetWindowTextA
cmp byte ptr [edi+esi-1], 0Ah//проверяется конец ввода
jnz short loc_4012FE
cmp esi, 7
jnz short loc_4012D//проверяется длина введенной строки
xor eax, eax
lea ecx, [esp+20h+var_14]//считается эффективный адрес в стеке
loc_4012AD:
mov dl, [ecx]//что-то читается, из стека
mov bl, [edi+eax]//что-то читается со строки
xor dl, 25h//изменяется
cmp bl, bl//сравнивается
jnz short loc_4012D5//не совпало переход
inc eax
add ecx, 4
cmp eax, 5
jl short loc_4012AD//проверка продолжается
//
break;
default:
return DefWindowProc(hwnd, Message, wparam, lparam);
}
return 0;
}

Перейдя по ссылке получаем предел совершенства защиты:
[code lang=asm]sub esp, 14h
mov eax, [esp+14h+Msg]
mov [esp+14h+var_14], 0C1h
cmp eax, 5
mov [esp+14h+var_10], 0D6h
mov [esp+14h+var_C], 0CAh
mov [esp+14h+var_8], 0CEh
mov [esp+14h+var_4], 0CBh[/code]
Но мы пароль пока не знаем. Хитрость в том, что когда что-то происходит с окном, пароль заносится в стек, а потом когда событие обработано, стек освобождается. И там как-бы ничего нет. Такое поведение характерно для программ написанных на С.

Но если обратить внимание, на esp+20h+var_14, то можно предположить, что это и есть пароль.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
31.10.2017, 17:29
общий
это ответ
Здравствуйте, ter4nastya!

Запускаем OllyDbg вместе с отлаживаемой программой. Переходим в режим:
View names (Просмотр названий) (Ctrl+N) - отображает таблицу, содержащую все имена (экспорт, импорт, библиотека, определяемые пользователем) определяемые или используемые в текущем модуле.

Находим функцию, которая читает информацию с поля ввода пароля, в данном случае - GetWindowTextA. Находим её в коде и ставим брейкпоинт.
Нам важен второй параметр, передаваемый в функцию, т.к. функция может вызываться из нескольких мест, если ПКМ-нуть на регистре EDI выбрать поле Follow in Dump, то после каждого нажатия клавиши, её код будет отображаться в памяти. Т.е. это наша функция, которая нам нужна.
За ней идет код:
[code lang=asm] cmp byte ptr [edi+esi-1], 0Ah
jnz short loc_4012FE
cmp esi, 7
jnz short loc_4012D5
xor eax, eax
lea ecx, [esp+20h+var_14]
loc_4012AD:
mov dl, [ecx]
mov bl, [edi+eax]
xor dl, 25h
cmp bl, dl
jnz short loc_4012D5
inc eax
add ecx, 4
cmp eax, 5
jl short loc_4012AD[/code]
Первый смр, проверяет нажата ли клавиша Enter, т.е. закончен ли ввод.
Второй смр, проверяет количество введенных символов, Enter записывается в память кодами 0Dh и 0Ah, т.е. в пароле 5-ть символов.
Выполняя код в шаговом режиме наблюдаем за регистром ЕСХ, как только он измениться, ПКМ-каем и выбираем пункт Folow in Stack, будет показано содержимое стека, см. рисунок.

Найдя механизм защиты, теперь можно:
- ввести правильное слово:
- заставить этот механизм сравнивать эталонное слово с самим собой;
- изменить условный переход, так, чтобы при вводе не правильного слова, выдавалось правильное сообщение.
Ну вот и всё.
Удачи!
5
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401367
6
02.11.2017, 10:28
общий
Адресаты:
Константин Николаевич, у меня осталось несколько вопросов по вашему ответу. Можно с вами как-то по Skype связаться, чтобы задать Вам сразу все мои вопросы и Вы ответили на них. Так как у нас с Москвой разница во времени на 7 часов, то сообщениями обмениваться не совсем удобно. А сама я с Дальнего востока
давно
Старший Модератор
31795
6196
04.11.2017, 13:08
общий
Адресаты:
Вы тут вопросы задавайте. Вполне возможно, у другого человека возникнут аналогичные вопросы и ответы он найдет тут.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа