184 lines
7.3 KiB
Markdown

# Kriptografski/Kompresioni Algoritmi
{{#include ../../banners/hacktricks-training.md}}
## Identifikacija Algoritama
Ako završite u kodu **koristeći pomeranja udesno i ulevo, xore i nekoliko aritmetičkih operacija**, veoma je verovatno da je to implementacija **kriptografskog algoritma**. Ovde će biti prikazani neki načini da se **identifikuje algoritam koji se koristi bez potrebe da se obrne svaki korak**.
### API funkcije
**CryptDeriveKey**
Ako se ova funkcija koristi, možete saznati koji se **algoritam koristi** proverom vrednosti drugog parametra:
![](<../../images/image (156).png>)
Proverite ovde tabelu mogućih algoritama i njihovih dodeljenih vrednosti: [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 dati bafer podataka.
**CryptAcquireContext**
Iz [dokumentacije](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Funkcija **CryptAcquireContext** se koristi za sticanje rukovanja određenim kontejnerom ključeva unutar određenog provajdera kriptografskih usluga (CSP). **Ovo vraćeno rukovanje se koristi u pozivima funkcija CryptoAPI** koje koriste odabrani CSP.
**CryptCreateHash**
Inicira heširanje toka podataka. Ako se ova funkcija koristi, možete saznati koji se **algoritam koristi** proverom vrednosti drugog parametra:
![](<../../images/image (549).png>)
\
Proverite ovde tabelu mogućih algoritama i njihovih dodeljenih vrednosti: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
### Konstantne vrednosti koda
Ponekad je veoma lako identifikovati algoritam zahvaljujući činjenici da mora koristiti posebnu i jedinstvenu vrednost.
![](<../../images/image (833).png>)
Ako pretražujete prvu konstantu na Google-u, ovo je ono što dobijate:
![](<../../images/image (529).png>)
Stoga, možete pretpostaviti da je dekompilirana funkcija **sha256 kalkulator.**\
Možete pretražiti bilo koju od drugih konstanti i dobićete (verovatno) isti rezultat.
### informacija o podacima
Ako kod nema nijednu značajnu konstantu, može biti da **učitava informacije iz .data sekcije**.\
Možete pristupiti tim podacima, **grupisati prvi dword** i pretražiti ga na Google-u kao što smo uradili u prethodnoj sekciji:
![](<../../images/image (531).png>)
U ovom slučaju, ako tražite **0xA56363C6**, možete pronaći da je povezan sa **tabelama AES algoritma**.
## RC4 **(Simetrična Kriptografija)**
### Karakteristike
Sastoji se od 3 glavna dela:
- **Faza inicijalizacije/**: Kreira **tabelu vrednosti od 0x00 do 0xFF** (ukupno 256 bajtova, 0x100). Ova tabela se obično naziva **Substituciona Kutija** (ili SBox).
- **Faza premeštanja**: **Prolazi kroz tabelu** kreiranu pre (petlja od 0x100 iteracija, ponovo) modifikujući svaku vrednost sa **polu-namernim** bajtovima. Da bi se kreirali ovi polu-namerni bajtovi, koristi se **ključ RC4**. **Ključevi RC4** mogu biti **između 1 i 256 bajtova dužine**, međutim obično se preporučuje da budu iznad 5 bajtova. Obično, ključevi RC4 su 16 bajtova dužine.
- **XOR faza**: Na kraju, običan tekst ili šifrovani tekst se **XOR-uje sa vrednostima kreiranim pre**. Funkcija za enkripciju i dekripciju je ista. Za ovo, **proći će se kroz kreiranih 256 bajtova** onoliko puta koliko je potrebno. Ovo se obično prepoznaje u dekompiliranom kodu sa **%256 (mod 256)**.
> [!TIP]
> **Da biste identifikovali RC4 u disasembleru/dekompiliranom kodu, možete proveriti 2 petlje veličine 0x100 (uz korišćenje ključa) i zatim XOR ulaznih podataka sa 256 vrednosti kreiranih pre u 2 petlje verovatno koristeći %256 (mod 256)**
### **Faza inicijalizacije/Substituciona Kutija:** (Obratite pažnju na broj 256 korišćen kao brojač i kako se 0 piše na svakom mestu od 256 karaktera)
![](<../../images/image (584).png>)
### **Faza premeštanja:**
![](<../../images/image (835).png>)
### **XOR faza:**
![](<../../images/image (904).png>)
## **AES (Simetrična Kriptografija)**
### **Karakteristike**
- Korišćenje **substitucionih kutija i tabela za pretragu**
- Moguće je **razlikovati AES zahvaljujući korišćenju specifičnih vrednosti tabela za pretragu** (konstanti). _Napomena da se **konstant** može **čuvati** u binarnom **ili kreirati** _**dinamički**._
- **Ključ za enkripciju** mora biti **deljiv** sa **16** (obično 32B) i obično se koristi **IV** od 16B.
### SBox konstante
![](<../../images/image (208).png>)
## Serpent **(Simetrična Kriptografija)**
### Karakteristike
- Retko se nalazi neki malware koji ga koristi, ali postoje primeri (Ursnif)
- Lako je odrediti da li je algoritam Serpent ili ne na osnovu njegove dužine (ekstremno duga funkcija)
### Identifikacija
Na sledećoj slici obratite pažnju na to kako se konstanta **0x9E3779B9** koristi (napomena da se ova konstanta takođe koristi od strane drugih kripto algoritama kao što je **TEA** -Tiny Encryption Algorithm).\
Takođe obratite pažnju na **veličinu petlje** (**132**) i **broj XOR operacija** u **disasembleru** i u **primeru koda**:
![](<../../images/image (547).png>)
Kao što je ranije pomenuto, ovaj kod može biti vizualizovan unutar bilo kog dekompilatora kao **veoma duga funkcija** jer **nema skakanja** unutar nje. Dekomplirani kod može izgledati ovako:
![](<../../images/image (513).png>)
Stoga, moguće je identifikovati ovaj algoritam proverom **magične brojke** i **početnih XOR-ova**, videći **veoma dugu funkciju** i **upoređujući** neke **instrukcije** duge funkcije **sa implementacijom** (kao što su pomeranje ulevo za 7 i rotacija ulevo za 22).
## RSA **(Asimetrična Kriptografija)**
### Karakteristike
- Složeniji od simetričnih algoritama
- Nema konstanti! (prilagođene implementacije su teške za određivanje)
- KANAL (analizator kriptografije) ne uspeva da pokaže naznake o RSA jer se oslanja na konstante.
### Identifikacija poređenjem
![](<../../images/image (1113).png>)
- U liniji 11 (levo) postoji `+7) >> 3` što je isto kao u liniji 35 (desno): `+7) / 8`
- Linija 12 (levo) proverava da li je `modulus_len < 0x040` i u liniji 36 (desno) proverava da li je `inputLen+11 > modulusLen`
## MD5 & SHA (heš)
### Karakteristike
- 3 funkcije: Init, Update, Final
- Slične inicijalizacione funkcije
### Identifikacija
**Init**
Možete identifikovati oba proverom konstanti. Napomena da sha_init ima 1 konstantu koju MD5 nema:
![](<../../images/image (406).png>)
**MD5 Transform**
Obratite pažnju na korišćenje više konstanti
![](<../../images/image (253) (1) (1).png>)
## CRC (heš)
- Manji i efikasniji jer je njegova funkcija da pronađe slučajne promene u podacima
- Koristi tabele za pretragu (tako da možete identifikovati konstante)
### Identifikacija
Proverite **konstante tabela za pretragu**:
![](<../../images/image (508).png>)
CRC heš algoritam izgleda ovako:
![](<../../images/image (391).png>)
## APLib (Kompresija)
### Karakteristike
- Nema prepoznatljivih konstanti
- Možete pokušati da napišete algoritam u python-u i pretražujete slične stvari na mreži
### Identifikacija
Grafik je prilično veliki:
![](<../../images/image (207) (2) (1).png>)
Proverite **3 poređenja da biste ga prepoznali**:
![](<../../images/image (430).png>)
{{#include ../../banners/hacktricks-training.md}}