Cryptographic/Compression Algorithms

Криптографічні/Компресійні Алгоритми

Підтримайте HackTricks

Визначення Алгоритмів

Якщо ви зустрілися з кодом, де використовуються зсуви вправо та вліво, XOR та кілька арифметичних операцій, велика ймовірність, що це реалізація криптографічного алгоритму. Тут будуть показані деякі способи визначення використаного алгоритму без необхідності розгортання кожного кроку.

Функції API

CryptDeriveKey

Якщо використовується ця функція, ви можете знайти, який алгоритм використовується, перевіривши значення другого параметра:

Перевірте тут таблицю можливих алгоритмів та їх призначені значення: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

RtlCompressBuffer/RtlDecompressBuffer

Стискає та розстискує заданий буфер даних.

CryptAcquireContext

З документації: Функція CryptAcquireContext використовується для отримання дескриптора певного контейнера ключів у певному постачальнику криптослужб (CSP). Цей отриманий дескриптор використовується в викликах функцій CryptoAPI, які використовують вибраний CSP.

CryptCreateHash

Ініціює хешування потоку даних. Якщо використовується ця функція, ви можете знайти, який алгоритм використовується, перевіривши значення другого параметра:

Перевірте тут таблицю можливих алгоритмів та їх призначені значення: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

Константи коду

Іноді дуже легко визначити алгоритм завдяки тому, що він потребує використання спеціального та унікального значення.

Якщо ви шукаєте першу константу в Google, отримаєте наступне:

Отже, можна припустити, що розгорнута функція - це калькулятор sha256. Ви можете шукати будь-яку іншу константу і, ймовірно, отримаєте той самий результат.

Інформація про дані

Якщо код не має значущої константи, можливо, він завантажує інформацію з розділу .data. Ви можете отримати доступ до цих даних, згрупувати перше слово та шукати його в Google, як ми робили в попередньому розділі:

У цьому випадку, якщо ви шукаєте 0xA56363C6, ви можете дізнатися, що це пов'язано з таблицями алгоритму AES.

RC4 (Симетрична Криптографія)

Характеристики

Складається з 3 основних частин:

  • Етап ініціалізації/: Створює таблицю значень від 0x00 до 0xFF (всього 256 байтів, 0x100). Цю таблицю зазвичай називають Таблицею Заміни (або SBox).

  • Етап перемішування: Пройде по таблиці, створеній раніше (цикл з 0x100 ітерацій, знову) змінюючи кожне значення за допомогою пів-випадкових байтів. Для створення цих пів-випадкових байтів використовується ключ RC4. Ключі RC4 можуть бути від 1 до 256 байтів у довжину, проте зазвичай рекомендується, щоб він був більше 5 байтів. Зазвичай ключі RC4 мають довжину 16 байтів.

  • Етап XOR: Нарешті, відкритий текст або шифротекст XORується зі створеними значеннями раніше. Функція для шифрування та дешифрування однакова. Для цього буде виконано цикл через створені 256 байтів стільки разів, скільки потрібно. Це зазвичай визначається в розгорнутому коді з %256 (mod 256).

Для визначення RC4 в розкладці/розгорнутому коді можна перевірити наявність 2 циклів розміром 0x100 (з використанням ключа) та потім XOR вхідних даних зі 256 значеннями, створеними раніше в цих 2 циклах, ймовірно, використовуючи %256 (mod 256)

Етап ініціалізації/Таблиця Заміни: (Зверніть увагу на число 256, використане як лічильник, та те, як 0 записано на кожному місці з 256 символів)

Етап перемішування:

Етап XOR:

AES (Симетрична Криптографія)

Характеристики

  • Використання таблиць заміни та таблиць пошуку

  • Можливо відрізнити AES завдяки використанню конкретних значень таблиць пошуку (констант). Зауважте, що константа може бути збережена в бінарному файлі або створена динамічно.

  • Ключ шифрування повинен бути кратним 16 (зазвичай 32 байти), і зазвичай використовується IV довжиною 16 байтів.

Константи SBox

Serpent (Симетрична Криптографія)

Характеристики

  • Рідко зустрічається віруси, які використовують його, але є приклади (Ursnif)

  • Просто визначити, чи алгоритм є Serpent або ні за його довжиною (дуже довга функція)

Визначення

На наступному зображенні зверніть увагу, як використовується константа 0x9E3779B9 (зверніть увагу, що ця константа також використовується іншими криптографічними алгоритмами, наприклад TEA -Tiny Encryption Algorithm). Також зверніть увагу на розмір циклу (132) та кількість операцій XOR в інструкціях розкладки та в прикладі коду:

Як було зазначено раніше, цей код можна візуалізувати всередині будь-якого декомпілятора як дуже довгу функцію, оскільки всередині неї немає стрибків. Розгорнутий код може виглядати наступним чином:

RSA (Асиметричне шифрування)

Характеристики

  • Складніший, ніж симетричні алгоритми

  • Немає постійних значень! (визначення власних реалізацій ускладнене)

  • KANAL (криптоаналізатор) не показує підказок щодо RSA, оскільки він ґрунтується на постійних значеннях.

Ідентифікація за порівнянням

  • У рядку 11 (ліворуч) є +7) >> 3, що є таким самим, як у рядку 35 (праворуч): +7) / 8

  • Рядок 12 (ліворуч) перевіряє, чи modulus_len < 0x040, а в рядку 36 (праворуч) перевіряється, чи inputLen+11 > modulusLen

MD5 & SHA (хешування)

Характеристики

  • 3 функції: Ініціалізація, Оновлення, Фіналізація

  • Схожі функції ініціалізації

Ідентифікація

Ініціалізація

Ви можете ідентифікувати обидва, перевіряючи постійні значення. Зверніть увагу, що sha_init має 1 постійне значення, якого немає у MD5:

MD5 Transform

Зверніть увагу на використання більше постійних значень

CRC (хешування)

  • Менший та ефективніший, оскільки його функція полягає в виявленні випадкових змін у даних

  • Використовує таблиці пошуку (тому ви можете ідентифікувати постійні значення)

Ідентифікація

Перевірте постійні значення таблиці пошуку:

Алгоритм хешування CRC виглядає так:

APLib (Стиснення)

Характеристики

  • Нерозпізнавані постійні значення

  • Ви можете спробувати написати алгоритм на Python та шукати схожі речі в Інтернеті

Ідентифікація

Графік досить великий:

Перевірте 3 порівняння для його визначення:

Last updated