# Algorytmy kryptograficzne/kompresji {{#include ../../banners/hacktricks-training.md}} ## Identyfikacja algorytmów Jeśli kończysz w kodzie **używając przesunięć w prawo i w lewo, xorów oraz kilku operacji arytmetycznych**, to jest bardzo prawdopodobne, że jest to implementacja **algorytmu kryptograficznego**. Poniżej przedstawione zostaną sposoby na **identyfikację algorytmu, który jest używany bez potrzeby odwracania każdego kroku**. ### Funkcje API **CryptDeriveKey** Jeśli ta funkcja jest używana, możesz znaleźć, który **algorytm jest używany**, sprawdzając wartość drugiego parametru: ![](<../../images/image (375) (1) (1) (1) (1).png>) Sprawdź tutaj tabelę możliwych algorytmów i ich przypisanych wartości: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) **RtlCompressBuffer/RtlDecompressBuffer** Kompresuje i dekompresuje dany bufor danych. **CryptAcquireContext** Z [dokumentacji](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Funkcja **CryptAcquireContext** jest używana do uzyskania uchwytu do konkretnego kontenera kluczy w danym dostawcy usług kryptograficznych (CSP). **Ten zwrócony uchwyt jest używany w wywołaniach funkcji CryptoAPI**, które korzystają z wybranego CSP. **CryptCreateHash** Inicjuje haszowanie strumienia danych. Jeśli ta funkcja jest używana, możesz znaleźć, który **algorytm jest używany**, sprawdzając wartość drugiego parametru: ![](<../../images/image (376).png>) \ Sprawdź tutaj tabelę możliwych algorytmów i ich przypisanych wartości: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) ### Stałe kodu Czasami naprawdę łatwo jest zidentyfikować algorytm dzięki temu, że musi używać specjalnej i unikalnej wartości. ![](<../../images/image (370).png>) Jeśli wyszukasz pierwszą stałą w Google, oto co otrzymasz: ![](<../../images/image (371).png>) Dlatego możesz założyć, że zdekompilowana funkcja to **kalkulator sha256.**\ Możesz wyszukać dowolną z innych stałych, a prawdopodobnie uzyskasz ten sam wynik. ### Informacje o danych Jeśli kod nie ma żadnej znaczącej stałej, może być **ładowany informacje z sekcji .data**.\ Możesz uzyskać dostęp do tych danych, **grupując pierwszy dword** i wyszukując go w Google, tak jak zrobiliśmy w poprzedniej sekcji: ![](<../../images/image (372).png>) W tym przypadku, jeśli poszukasz **0xA56363C6**, możesz znaleźć, że jest to związane z **tabelami algorytmu AES**. ## RC4 **(Symetryczna kryptografia)** ### Cechy 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 powszechnie nazywana **Substitution Box** (lub SBox). - **Etap mieszania**: Będzie **przechodzić przez tabelę** utworzoną wcześniej (pętla 0x100 iteracji, ponownie) modyfikując każdą wartość za pomocą **półlosowych** bajtów. Aby stworzyć te półlosowe bajty, używany jest klucz RC4. Klucze RC4 mogą mieć **od 1 do 256 bajtów długości**, jednak zazwyczaj zaleca się, aby miały więcej niż 5 bajtów. Zwykle klucze RC4 mają długość 16 bajtów. - **Etap XOR**: Na koniec, tekst jawny lub szyfrogram jest **XORowany z wartościami utworzonymi wcześniej**. Funkcja do szyfrowania i deszyfrowania jest taka sama. W tym celu zostanie wykonana **pętla przez utworzone 256 bajtów** tyle razy, ile to konieczne. Zwykle jest to rozpoznawane w zdekompilowanym kodzie z **%256 (mod 256)**. > [!TIP] > **Aby zidentyfikować RC4 w kodzie disassembly/zdekompilowanym, możesz sprawdzić 2 pętle o rozmiarze 0x100 (z użyciem klucza), a następnie XOR danych wejściowych z 256 wartościami utworzonymi wcześniej w 2 pętlach, prawdopodobnie używając %256 (mod 256)** ### **Etap inicjalizacji/Substitution Box:** (Zauważ liczbę 256 używaną jako licznik i jak 0 jest zapisywane w każdym miejscu 256 znaków) ![](<../../images/image (377).png>) ### **Etap mieszania:** ![](<../../images/image (378).png>) ### **Etap XOR:** ![](<../../images/image (379).png>) ## **AES (Symetryczna kryptografia)** ### **Cechy** - Użycie **tabel substytucyjnych i tabel wyszukiwania** - Możliwe jest **rozróżnienie AES dzięki użyciu specyficznych wartości tabel wyszukiwania** (stałych). _Zauważ, że **stała** może być **przechowywana** w binarnym **lub tworzona** _**dynamicznie**._ - **Klucz szyfrowania** musi być **podzielny** przez **16** (zwykle 32B) i zazwyczaj używa się **IV** o długości 16B. ### Stałe SBox ![](<../../images/image (380).png>) ## Serpent **(Symetryczna kryptografia)** ### Cechy - Rzadko można znaleźć złośliwe oprogramowanie używające go, ale są przykłady (Ursnif) - Łatwo określić, czy algorytm to Serpent, czy nie, na podstawie jego długości (ekstremalnie długa funkcja) ### Identyfikacja Na poniższym obrazie zauważ, jak stała **0x9E3779B9** jest używana (zauważ, że ta stała jest również używana przez inne algorytmy kryptograficzne, takie jak **TEA** - Tiny Encryption Algorithm).\ Zauważ także **rozmiar pętli** (**132**) i **liczbę operacji XOR** w instrukcjach **disassembly** oraz w przykładzie **kodu**: ![](<../../images/image (381).png>) Jak wspomniano wcześniej, ten kod może być wizualizowany w dowolnym dekompilatorze jako **bardzo długa funkcja**, ponieważ **nie ma skoków** w jej wnętrzu. Zdekompilowany kod może wyglądać następująco: ![](<../../images/image (382).png>) 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** długiej funkcji **z implementacją** (jak przesunięcie w lewo o 7 i obrót w lewo o 22). ## RSA **(Asymetryczna kryptografia)** ### Cechy - Bardziej złożone niż algorytmy symetryczne - Nie ma stałych! (trudno określić niestandardowe implementacje) - KANAL (analityk kryptograficzny) nie pokazuje wskazówek dotyczących RSA, ponieważ opiera się na stałych. ### Identyfikacja przez porównania ![](<../../images/image (383).png>) - W linii 11 (po lewej) znajduje się `+7) >> 3`, co jest takie samo jak w linii 35 (po prawej): `+7) / 8` - Linia 12 (po lewej) sprawdza, czy `modulus_len < 0x040`, a w linii 36 (po prawej) sprawdza, czy `inputLen+11 > modulusLen` ## MD5 i SHA (hash) ### Cechy - 3 funkcje: Init, Update, Final - Podobne funkcje inicjalizacyjne ### Identyfikacja **Init** Możesz zidentyfikować obie, sprawdzając stałe. Zauważ, że sha_init ma 1 stałą, której MD5 nie ma: ![](<../../images/image (385).png>) **MD5 Transform** Zauważ użycie większej liczby stałych ![](<../../images/image (253) (1) (1) (1).png>) ## CRC (hash) - Mniejszy i bardziej wydajny, ponieważ jego funkcją jest znajdowanie przypadkowych zmian w danych - Używa tabel wyszukiwania (więc możesz zidentyfikować stałe) ### Identyfikacja Sprawdź **stałe tabeli wyszukiwania**: ![](<../../images/image (387).png>) Algorytm haszujący CRC wygląda jak: ![](<../../images/image (386).png>) ## APLib (Kompresja) ### Cechy - Nie rozpoznawalne stałe - Możesz spróbować napisać algorytm w Pythonie i wyszukać podobne rzeczy w Internecie ### Identyfikacja Wykres jest dość duży: ![](<../../images/image (207) (2) (1).png>) Sprawdź **3 porównania, aby go rozpoznać**: ![](<../../images/image (384).png>) {{#include ../../banners/hacktricks-training.md}}