# Algorytmy kryptograficzne/kompresji ## Algorytmy kryptograficzne/kompresji {% hint style="success" %} Dowiedz się i ćwicz Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Dowiedz się i ćwicz Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Wesprzyj HackTricks * Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)! * **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Udostępnij sztuczki hakerskie, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów GitHub.
{% endhint %} ## 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: ![](<../../.gitbook/assets/image (156).png>) Sprawdź tutaj tabelę możliwych algorytmów i ich przypisane 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** 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: ![](<../../.gitbook/assets/image (549).png>) Sprawdź tutaj tabelę możliwych algorytmów i ich przypisane 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 łatwo jest zidentyfikować algorytm dzięki konieczności użycia specjalnej i unikalnej wartości. ![](<../../.gitbook/assets/image (833).png>) Jeśli wyszukasz pierwszą stałą w Google, otrzymasz: ![](<../../.gitbook/assets/image (529).png>) 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: ![](<../../.gitbook/assets/image (531).png>) 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) ![](<../../.gitbook/assets/image (584).png>) ### **Etap mieszania:** ![](<../../.gitbook/assets/image (835).png>) ### **Etap XOR:** ![](<../../.gitbook/assets/image (904).png>) ## **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 ![](<../../.gitbook/assets/image (208).png>) ## 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**: ![](<../../.gitbook/assets/image (547).png>) 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: ![](<../../.gitbook/assets/image (513).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** 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 ![](<../../.gitbook/assets/image (1113).png>) * 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, czy `inputLen+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: ![](<../../.gitbook/assets/image (406).png>) **Transformacja MD5** Zauważ użycie większej liczby stałych ![](<../../.gitbook/assets/image (253) (1) (1).png>) ## 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ń**: ![](<../../.gitbook/assets/image (508).png>) Algorytm funkcji skrótu CRC wygląda tak: ![](<../../.gitbook/assets/image (391).png>) ## 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: ![](<../../.gitbook/assets/image (207) (2) (1).png>) Sprawdź **3 porównania, aby go rozpoznać**: ![](<../../.gitbook/assets/image (430).png>)