Арифметика на службі захисту

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Потрапила мені тут якось одна програма, яка вимагала, як це зазвичай буває в таких випадках, пароля:

Арифметика на службі захисту

Справа була на вихідних, а тому настрої щільно в чому-небудь ритися не було. Здавалося б, зручна нагода розім'яти пальці протягом декількох годин, тим більше, що я завжди любив проги з текстовим режимом (як ще кажуть, "досовської", хоча від доса часто в них нічого немає).

Запускаю td + програма ... Зараз тільки знайти буфер, і все. Перехопити int 16 і клавішні ф-ції int 21 з td якось відразу не вийшло, бо виходжу з td і запускаю маленького резидента, що схопив ці вектора.

Хокей. На Досьо резидент нічого не сказав (або я не все ф-ції йому вказав), а ось по int 16 всі адреси перерахував. Заходжу знову в td, вже з папірцем з цими адресами, ставлю break, але щось мені відразу ось це не сподобалося:

int 16h

jmp far ...

Через декілька секунд я розумію, що прога працює в pm. З td особливо з pm не попрацюєш. Що робити? По-чесному, не хотілося воювати з прогою, яку хтось, особливо не замислюючись, зв'язані з ектсендером на чому-небудь типу clarion'а, та й час шкода. Що ж, доведеться як завжди.

У softice все стало значно простіше. Написав в поле "Пароль" екзотику типу ABC123 і дав команду пошуку в пам'яті:

s 0030:0000 L FFFFFFFF 'ABC123'; У мене win 98

Знайшлося все, тільки от вже тоді для мене був тривожним рингом те, що зовсім не один раз ... Гаразд, ставлю на знайдених хлопців bpm, ловлю програму на перевірці паролю:

: 1710:

mov bx, ds

les di ,[...]; Адреса введеного пароля -> ABC123

lds si ,[...]; Адреса еталонного пароля

repz cmpsb

Так, ось і все. У відладчику знайти пароль виявилося досить просто. Однак я вже витратив близько 1,5 години (резидент готував) і захотілося більшого, захотілося зробити "нагадувач" пароля.

Спочатку я дослідним шляхом встановив, що пароль залежить від введеного INN та коду (на малюнку вище він дорівнює 072 163), більше нічого на нього не впливає. Кілька варіантів отриманих "паролів" підтвердили мою думку, що пароль завжди включає в себе лише цифри. Взагалі, паролі повинні бути лише з цифр. Так простіше програмісту. Так простіше ... неважливо. Загалом, переді мною лежало щось досить приємне ... щось на зразок crack me.

Отже, приступимо. Стандартні кроки: вбиваю INN, шукаю в пам'яті, збираюся ставити на знайдений буфер bpm і стежити за процесом. Але що це? Цих буферів багато. Їх дуже багато! Якщо шарити в пам'яті після проходження поля "Пароль", то їх не менше 28! (Ви вже вибачте, що не зміг до кінця дорахувати). У одних лише байтах softice'а десь у старших адресах C0XX, де мешкають vxd-модуля, їх горде число - один!

Контрольних точок тільки чотири. Гаразд, все ж спробуємо ... Ставлю на перші чотири знайдених буфера. Понеслися! Ех ... Бачу, як програма копіює один в іншій, інший в третій ... Та ще, зараза, норовить їх в стеку розмістити, тому після кожного звільнення під інші потреби виникають холості брейки. Особливо прикро їх бачити після команд типу push або call.

Ні, це не вихід. Це дуже трудомісткий шлях. Може бути, пароль? Ні, пароль - це добре. Але він використовується тільки для порівняння. Як щодо значення з поля "Код"? Проробляю всі ті ж кроки, що і при пошуку звернень до ІПН. Все те ж саме - купа пересилань.

Зворотний реверсінг? Знайти буфер з освіченою паролем, і стежити, як його отримують? Роблю знову пошук по пам'яті, але вже з правильним кодом. Є! Але знову - багато.

Але тут мені трохи пощастило. Ввів я ІПН = 1234567894, щоб було легше шукати. Відстежуючи буфера, що містять правильний код, знаходжу ось такий:

59497190000000000000 .. 0; 16-ть цифр, для ІПН = 1234567894 та коду 855907

Схоже на відформатований велике число. Пароль теж складається з чисел. "Істина десь поруч" (c) Фокс Малдер. Цілеспрямовано вже шукаю того, хто їх зробив і знаходжу ось таку підпрограму:

: 6D32:

push es

mov ax, ds

...

mov cx, 4

rep movsw; ds: si -> 0,0,0, C0, 45, B2, 56,41 ...

...

...

: 6DD5:

mov cx, 10h

xor al, al

push cx, bx, dx, bp, si, ax

shl ah, 1

rcl si, 1

rcl bp, 1

rcl dx, 1

rcl bx, 1

rcl al, 1

shl ah, 1

rcl si, 1

rcl bp, 1

rcl dx, 1

rcl bx, 1

rcl al, 1

pop cx

add ah, ch

pop cx

add si, cx

...

shl ah, 1

rcl si, 1

rcl bp, 1

rcl dx, 1

rcl bx, 1

rcl al, 1

add al, 30h

stosb; Формує якраз "594971900000 ..."

pop cx

loop ...

Чесно кажучи, я видер її;) Я видер її з екзешнік, видер і налагодив, навчився подавати на вхід за 8-м байт в ds: si і отримувати ось такі от "числа". Ось які дані отримує ця процедура, і ось що вона видає кожного разу, коли розраховує пароль (всього ~ 32 рази):

ds: si -> 0,0,0, 0,86,58,31,41 result = "1136774000 ..."

ds: si -> 0,0,0,80, DF, 67,40,41 result = "2150335000 ..."

ds: si -> 0,0,0,80,9 F, 45,4 D, 41 result = "3836735000 ..."

...

ds: si -> 0,0,0, C0, 41,55,52,41 result = "4805895000 ..."

ds: si -> 0,0,0, C0, 45, B2, 56,41 result = "5949719000 ..."

Я думав, що знайшов ключовий код, який итерациями формує пароль! Коли маєш справу з криптографією, звикаєш, що зрушення та and-и у величезних кількостях просто так не зустрічаються. Перше число як-то виходить з INN і Код'а - зліплюють по-хитрому або щось на зразок того, думав я.

Шукаю вже посилання на парметр, рухаючись цій процедурі (у ds: si). Шукав спочатку уважно, потім не дуже, потім просто тупо переписував адреси буферів (знову дуже багато копіювань). Але все ж я не пройшов повз ось цих двох процедур:

fld real8 ptr [bp +6]

fmul real8 ptr [bp +0 E]

fstp real8 ptr ds :[...]

і:

fld real8 ptr [bp +6]

fadd real8 ptr [bp +0 E]

fstp real8 ptr ds :[...]

Причому ці процедури викликаються кратне число разів коду, формує ці довгі числа. Вже тепліше. Дивлюся, що роблять ці хлопці. І бачу, що при черговому виклику, після fadd, співпроцесор вивантажує ті самі вхідні байти, які подаються на вхід процедурі створення довгих чисел ... Це була просто процедура форматування real-чисел!

Мда ... Ось що означає бути розбещеною співпроцесором. Якби не ця прога, то так би і не дізнався, як виглядають числа у форматі з плаваючою точкою.

Тепер вже уважніше дивлюся, що ж ми там множимо і ділимо. Виявляється, циклічно викликається по два множення, потім - додавання. А ось що множиться і складається:

Крок

1. 1x1 = 1 1x2401 = 2401 1 +2401 = 2402

2. 2x2 = 4 4x2500 = 10000 2402 +10000 = 12402

3. 3x3 = 9 9x2601 = 23409 23409 +15986 = 35811

4. 4x4 = 16 16x2704 = 43264 43264 +35811 = 79075

...

І так 42 рази. На наступному якраз виходить шуканий код для ІПН = "1234567894", тільки з "зайвої" п'ятіркою попереду:

Крок

42. 42x42 = 1746 1746x2916 = 5091336 5091336 +805895 = 5949719

...

"Зайва" п'ятірка відразу показує, що не з усіма кроками все "чисто". А саме - наприклад, на останньому кроці складається твір 1746x2916 не з результатом предидущую складання (4805895), а з його частиною (805895). Тепер з'ясовується приблизний алгоритм:

SUM = 1

LOOP I = ​​1 TO 42

SUM + = I ^ 2 x S [i]

IF I = STEP_LEVEL THEN ... ; Відкусити старші розряди

END LOOP

; Де S [i] - добавка на кожному I-му кроці

Ось навіщо потрібен був код форматування нецілих чисел! Програміст не знайшов нічого кращого, ніж переформатувати real-число в рядок і контекстним пошуком з'ясовувати, чи не потрібно відкинути старші розряди! :)

Залишається з'ясувати, що таке ці S [i]. Ось їх перелік:

Крок S [i]

1. 2401

2. 2500

3. 2601

4. 2704

...

Що ж це за числа? Ми зводимо індекс у квадрат, чи немає і тут чогось схожого? Дійсно:

Крок S [i]

1. 2401 = 49 ^ 2

2. 2500 = 50 ^ 2

3. 2601 = 51 ^ 2

4. 2704 = 52 ^ 2

...

Ага, зрозуміло, що це за числа! Та це ж байти ІПН: "12345 ...". А що далі? ІПН довжиною 10 символів, перші 10 кроків зрозумілі. Але далі S [i] стають загадковими:

Крок S [i]

11. 16641 = 129 ^ 2

12. 25600 = 160 ^ 2

13. 29241 = 171 ^ 2

14. 25600 = 160 ^ 2

...

Такі S [i] слідують якийсь час, але потім стає знову зрозуміло їх походження: кроки 31-36 додають до цієї "контрольної суми" цифри поля "код".

Тут я зрозумів, що справа близько до розв'язки. Але не зрозумів, що настільки. Перша версія - проміжні S [i] - якісь магічні константи. Приготувався навіть пошукати можливий їх формувач. Для початку вирішив все ж пошукати їх у файлі ... Так, так, вони там були ...

Залишилося привести код remainder'а. Писати його на АСМ, як я зазвичай роблю, було якось не прикольно. Так що вибачте за пас. Але і в ньому я все ж таки обійшовся без real-чисел. У структурі, оголошеної в програмі, пояснюється, навіщо потрібні були додаткові байти (S [i]).

{$ A-}

{$ N +}

{$ S-}

{$ D-}

const

{INN: string [11] = '0000000000 ';}

INN: string [11] = '7575757575 '; {result must be 359683}

TypeSetup: string [11] = 'Преферанс';

Code: string [7] = '014194 ';

Version: string [7] = 'Вер 46';

type

tExtPassData =

record

INN: array [1 .. 10] of byte; {ІПН - разом з ключем}

TypeSetup: array [1 .. 10] of byte; {Тип конфігурації: Преферанс, etc}

Fillers: array [1 .. 10] of byte; {Прогалини}

Code: array [1 .. 6] of byte; {Код}

Version: array [1 .. 6] of byte; {Версія програми: Вер 46 і т.п. }

end;

var

sum, i, PassByte: longint;

ExtPassData: tExtPassData;

begin

writeln; writeln ('Preferance password remainder started!'); writeln;

{Ask for INN & Code}

write ('Enter your INN:'); readln (INN);

write ('Enter your Code:'); readln (Code);

{Make extended "password"}

fillchar (ExtPassData, sizeof (tExtPassData), '');

move (INN [1], ExtPassData.INN, length (INN));

move (TypeSetup [1], ExtPassData.TypeSetup, length (TypeSetup));

move (Code [1], ExtPassData.Code, length (Code));

move (Version [1], ExtPassData.Version, length (Version));

{Create control sum}

PassByte: = 0;

sum: = 1;

for i: = 1 to sizeof (tExtPassData) do

begin

move (ExtPassData.INN [i], PassByte, 1);

inc (sum, (i * i) * (PassByte * PassByte));

if i> sizeof (ExtPassData.INN) then

while sum> 1000000 do dec (sum, 1000000);

end;

writeln ('Your password for full version is "', sum, '". Enjoy it!;)')

Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Реферат
17.1кб. | скачати


Схожі роботи:
Довга арифметика
Літературні герої і Арифметика
Арифметика надвеликих натуральних чисел в паралельних обчислювальних системах
Діловодство в кадровій службі
Маннергейм На службі Росії
Регулювання конфліктів на державній і муніципальної службі
Генерал Власов Зрадник на службі Гітлера
Мультимедійні технології на службі охорони праці
Життя Достоєвського на каторзі і на солдатській службі
© Усі права захищені
написати до нас