ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

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

     

    Інформатика, програмування

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

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

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

    Запускаю 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 та коду (на малюнку вище він дорівнює 072163), більше нічого на нього не впливає. Кілька варіантів отриманих "паролів" підтвердили мою думку, що пароль завжди включає в себе тільки цифри. Взагалі, паролі повинні бути тільки з цифр. Так простіше програмісту. Так простіше ... неважливо. Загалом, переді мною лежало щось досить приємне ... щось на зразок 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! ;)')

    Список літератури

    Для підготовки даної роботи були використані матеріали з сайту http://www.bugtraq.ru/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status