.. | ||
README.md | ||
unpacking-binaries.md |
Algorytmy kryptograficzne/kompresji
Algorytmy kryptograficzne/kompresji
{% hint style="success" %}
Dowiedz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Dowiedz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Wesprzyj HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Udostępnij sztuczki hakerskie, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów GitHub.
Identyfikacja algorytmów
Jeśli znajdziesz kod korzystający z przesunięć bitowych, operacji XOR i kilku operacji arytmetycznych, jest bardzo prawdopodobne, że jest to implementacja algorytmu kryptograficznego. Poniżej zostaną przedstawione sposoby identyfikacji użytego algorytmu bez konieczności odwracania każdego kroku.
Funkcje API
CryptDeriveKey
Jeśli jest używana ta funkcja, można sprawdzić, który algorytm jest używany, sprawdzając wartość drugiego parametru:
Sprawdź tutaj tabelę możliwych algorytmów i ich przypisane wartości: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
RtlCompressBuffer/RtlDecompressBuffer
Kompresuje i dekompresuje dany bufor danych.
CryptAcquireContext
Z dokumentacji: Funkcja CryptAcquireContext służy do uzyskania uchwytu do określonego kontenera kluczy w określonym dostawcy usług kryptograficznych (CSP). Ten zwrócony uchwyt jest używany w wywołaniach funkcji CryptoAPI korzystających z wybranego CSP.
CryptCreateHash
Inicjuje haszowanie strumienia danych. Jeśli jest używana ta funkcja, można sprawdzić, który algorytm jest używany, sprawdzając wartość drugiego parametru:
Sprawdź tutaj tabelę możliwych algorytmów i ich przypisane wartości: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
Stałe kodu
Czasami łatwo jest zidentyfikować algorytm dzięki konieczności użycia specjalnej i unikalnej wartości.
Jeśli wyszukasz pierwszą stałą w Google, otrzymasz:
Dlatego można założyć, że zdekompilowana funkcja to kalkulator sha256.
Możesz wyszukać dowolną inną stałą i prawdopodobnie otrzymasz ten sam wynik.
Informacje o danych
Jeśli kod nie zawiera istotnej stałej, może wczytywać informacje z sekcji .data.
Możesz uzyskać dostęp do tych danych, zgrupować pierwsze słowo i wyszukać je w Google, tak jak zrobiliśmy wcześniej:
W tym przypadku, jeśli wyszukasz 0xA56363C6, dowiesz się, że jest to związane z tabelami algorytmu AES.
RC4 (Szyfrowanie symetryczne)
Charakterystyka
Składa się z 3 głównych części:
- Etap inicjalizacji/: Tworzy tabelę wartości od 0x00 do 0xFF (łącznie 256 bajtów, 0x100). Ta tabela jest zwykle nazywana Substitution Box (lub SBox).
- Etap mieszania: Przejdzie przez tabelę utworzoną wcześniej (pętla 0x100 iteracji, ponownie) modyfikując każdą wartość za pomocą półlosowych bajtów. Aby utworzyć te półlosowe bajty, używany jest klucz RC4. Klucze RC4 mogą mieć długość od 1 do 256 bajtów, jednak zazwyczaj zaleca się, aby były one powyżej 5 bajtów. Zazwyczaj klucze RC4 mają długość 16 bajtów.
- Etap XOR: Wreszcie, tekst jawnie lub zaszyfrowany jest XORowany z utworzonymi wcześniej wartościami. Funkcja do szyfrowania i deszyfrowania jest taka sama. W tym celu zostanie wykonana pętla przez utworzone 256 bajtów tak wiele razy, ile jest to konieczne. Zazwyczaj jest to rozpoznawane w zdekompilowanym kodzie za pomocą %256 (mod 256).
{% hint style="info" %} Aby zidentyfikować RC4 w kodzie disassembly/dekompilowanym, można sprawdzić 2 pętle o rozmiarze 0x100 (z użyciem klucza) oraz XOR danych wejściowych z 256 wartościami utworzonymi wcześniej w tych 2 pętlach, prawdopodobnie z użyciem %256 (mod 256) {% endhint %}
Etap inicjalizacji/Substitution Box: (Zauważ liczbę 256 używaną jako licznik i jak 0 jest zapisywane na każdym miejscu spośród 256 znaków)
Etap mieszania:
Etap XOR:
AES (Szyfrowanie symetryczne)
Charakterystyka
- Użycie skrzynek substytucji i tabel przeglądowych
- Możliwe jest rozróżnienie AES dzięki użyciu określonych wartości tabeli przeglądowej (stałych). Zauważ, że stała może być przechowywana w pliku binarnym lub tworzona dynamicznie.
- Klucz szyfrowania musi być podzielny przez 16 (zwykle 32B), a zazwyczaj używany jest IV o długości 16B.
Stałe SBox
Serpent (Szyfrowanie symetryczne)
Charakterystyka
- Rzadko można znaleźć złośliwe oprogramowanie używające go, ale istnieją przykłady (Ursnif)
- Łatwo określić, czy algorytm to Serpent, na podstawie jego długości (bardzo długa funkcja)
Identyfikacja
Na poniższym obrazku zauważ, jak używana jest stała 0x9E3779B9 (zauważ, że ta stała jest również używana przez inne algorytmy kryptograficzne, takie jak TEA -Tiny Encryption Algorithm).
Zauważ również rozmiar pętli (132) i liczbę operacji XOR w instrukcjach disassembly oraz w przykładzie kodu:
Jak wspomniano wcześniej, ten kod może być zobrazowany w dowolnym dekompilatorze jako bardzo długa funkcja, ponieważ wewnątrz niej nie ma skoków. Zdekompilowany kod może wyglądać tak jak poniżej:
Dlatego możliwe jest zidentyfikowanie tego algorytmu, sprawdzając magiczną liczbę i początkowe XORy, widząc bardzo długą funkcję i porównując niektóre instrukcje z długiej funkcji z implementacją (taką jak przesunięcie w lewo o 7 i obrót w lewo o 22).
RSA (Szyfrowanie asymetryczne)
Charakterystyka
- Bardziej złożony niż algorytmy symetryczne
- Brak stałych! (trudne określenie niestandardowej implementacji)
- KANAL (analizator kryptograficzny) nie wykazuje wskazówek dotyczących RSA, ponieważ polega na stałych.
Identyfikacja poprzez porównania
- W linii 11 (lewa) jest
+7) >> 3
, co jest takie samo jak w linii 35 (prawa):+7) / 8
- Linia 12 (lewa) sprawdza, czy
modulus_len < 0x040
, a w linii 36 (prawa) sprawdza, czyinputLen+11 > modulusLen
MD5 & SHA (funkcje skrótu)
Charakterystyka
- 3 funkcje: Inicjalizacja, Aktualizacja, Końcowa
- Podobne funkcje inicjalizacji
Identyfikacja
Inicjalizacja
Możesz je zidentyfikować, sprawdzając stałe. Zauważ, że sha_init ma 1 stałą, której MD5 nie ma:
Transformacja MD5
Zauważ użycie większej liczby stałych
CRC (funkcja skrótu)
- Mniejsza i bardziej wydajna, ponieważ jej funkcją jest znajdowanie przypadkowych zmian w danych
- Wykorzystuje tablice poszukiwań (dzięki czemu można zidentyfikować stałe)
Identyfikacja
Sprawdź stałe tablicy poszukiwań:
Algorytm funkcji skrótu CRC wygląda tak:
APLib (Kompresja)
Charakterystyka
- Stałe nie do rozpoznania
- Możesz spróbować napisać algorytm w języku Python i szukać podobnych rzeczy online
Identyfikacja
Graf jest dość duży:
Sprawdź 3 porównania, aby go rozpoznać: