Криптографічні/Стиснення Алгоритми
Reading time: 6 minutes
Криптографічні/Стиснення Алгоритми
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Визначення Алгоритмів
Якщо ви закінчуєте в коді використовуючи зсуви вправо та вліво, 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.
Ви можете отримати доступ до цих даних, групуючи перший dword і шукати його в Google, як ми робили в попередньому розділі:
У цьому випадку, якщо ви шукаєте 0xA56363C6, ви можете знайти, що це пов'язано з таблицями алгоритму AES.
RC4 (Симетричний Крипт)
Характеристики
Він складається з 3 основних частин:
- Стадія ініціалізації/: Створює таблицю значень від 0x00 до 0xFF (всього 256 байт, 0x100). Цю таблицю зазвичай називають Substitution Box (або SBox).
- Стадія перемішування: Буде проходити через таблицю, створену раніше (цикл 0x100 ітерацій, знову) модифікуючи кожне значення з напіввипадковими байтами. Для створення цих напіввипадкових байтів використовується ключ RC4. Ключі RC4 можуть бути від 1 до 256 байт в довжину, однак зазвичай рекомендується, щоб вони були більше 5 байт. Зазвичай ключі RC4 мають довжину 16 байт.
- Стадія XOR: Нарешті, відкритий текст або шифротекст XORed з значеннями, створеними раніше. Функція для шифрування та дешифрування однакова. Для цього буде виконано проходження через створені 256 байт стільки разів, скільки необхідно. Це зазвичай розпізнається в декомпільованому коді з %256 (mod 256).
note
Щоб визначити RC4 у дизасембльованому/декомпільованому коді, ви можете перевірити 2 цикли розміру 0x100 (з використанням ключа), а потім XOR вхідних даних з 256 значеннями, створеними раніше в 2 циклах, ймовірно, використовуючи %256 (mod 256)
Стадія ініціалізації/Substitution Box: (Зверніть увагу на число 256, яке використовується як лічильник, і як 0 записується в кожному місці з 256 символів)
Стадія перемішування:
Стадія XOR:
AES (Симетричний Крипт)
Характеристики
- Використання боксів заміни та таблиць пошуку
- Можливо відрізнити AES завдяки використанню специфічних значень таблиць пошуку (констант). _Зверніть увагу, що константа може бути збережена в бінарному або створена динамічно.
- Ключ шифрування повинен бути доступний на 16 (зазвичай 32B) і зазвичай використовується IV довжиною 16B.
Константи SBox
Serpent (Симетричний Крипт)
Характеристики
- Рідко можна знайти деяке шкідливе ПЗ, яке його використовує, але є приклади (Ursnif)
- Легко визначити, чи є алгоритм Serpent, чи ні, на основі його довжини (надзвичайно довга функція)
Визначення
На наступному зображенні зверніть увагу, як використовується константа 0x9E3779B9 (зверніть увагу, що ця константа також використовується іншими криптоалгоритмами, такими як TEA -Tiny Encryption Algorithm).
Також зверніть увагу на розмір циклу (132) та кількість операцій XOR в інструкціях дизасемблювання та в прикладі коду:
Як вже згадувалося, цей код можна візуалізувати в будь-якому декомпілері як дуже довгу функцію, оскільки в ній немає стрибків. Декомпільований код може виглядати наступним чином:
Отже, можливо визначити цей алгоритм, перевіривши магічне число та початкові XOR, бачачи дуже довгу функцію та порівнюючи деякі інструкції довгої функції з реалізацією (наприклад, зсув вліво на 7 та обертання вліво на 22).
RSA (Асиметричний Крипт)
Характеристики
- Складніший, ніж симетричні алгоритми
- Немає констант! (кастомні реалізації важко визначити)
- KANAL (криптоаналізатор) не може показати підказки щодо RSA, оскільки покладається на константи.
Визначення за допомогою порівнянь
- У рядку 11 (ліворуч) є
+7) >> 3
, що таке ж, як у рядку 35 (праворуч):+7) / 8
- Рядок 12 (ліворуч) перевіряє, чи
modulus_len < 0x040
, а в рядку 36 (праворуч) перевіряється, чиinputLen+11 > modulusLen
MD5 & SHA (хеш)
Характеристики
- 3 функції: Init, Update, Final
- Схожі ініціалізаційні функції
Визначити
Init
Ви можете визначити обидва, перевіривши константи. Зверніть увагу, що sha_init має 1 константу, якої MD5 не має:
MD5 Transform
Зверніть увагу на використання більшої кількості констант
CRC (хеш)
- Менший і більш ефективний, оскільки його функція полягає в знаходженні випадкових змін у даних
- Використовує таблиці пошуку (тому ви можете визначити константи)
Визначити
Перевірте константи таблиці пошуку:
Алгоритм хешування CRC виглядає так:
APLib (Стиснення)
Характеристики
- Непізнавані константи
- Ви можете спробувати написати алгоритм на python і шукати подібні речі в Інтернеті
Визначити
Графік досить великий:
Перевірте 3 порівняння, щоб його розпізнати:
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.