mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
184 lines
7.5 KiB
Markdown
184 lines
7.5 KiB
Markdown
# 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:
|
|
|
|
 (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:
|
|
|
|
.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.
|
|
|
|
.png>)
|
|
|
|
Jeśli wyszukasz pierwszą stałą w Google, oto co otrzymasz:
|
|
|
|
.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:
|
|
|
|
.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)
|
|
|
|
.png>)
|
|
|
|
### **Etap mieszania:**
|
|
|
|
.png>)
|
|
|
|
### **Etap XOR:**
|
|
|
|
.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
|
|
|
|
.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**:
|
|
|
|
.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:
|
|
|
|
.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
|
|
|
|
.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:
|
|
|
|
.png>)
|
|
|
|
**MD5 Transform**
|
|
|
|
Zauważ użycie większej liczby stałych
|
|
|
|
 (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**:
|
|
|
|
.png>)
|
|
|
|
Algorytm haszujący CRC wygląda jak:
|
|
|
|
.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:
|
|
|
|
 (2) (1).png>)
|
|
|
|
Sprawdź **3 porównania, aby go rozpoznać**:
|
|
|
|
.png>)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|