mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
184 lines
7.3 KiB
Markdown
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:
|
|
|
|
.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:
|
|
|
|
.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.
|
|
|
|
.png>)
|
|
|
|
Ako pretražujete prvu konstantu na Google-u, ovo je ono što dobijate:
|
|
|
|
.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:
|
|
|
|
.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)
|
|
|
|
.png>)
|
|
|
|
### **Faza premeštanja:**
|
|
|
|
.png>)
|
|
|
|
### **XOR faza:**
|
|
|
|
.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
|
|
|
|
.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**:
|
|
|
|
.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:
|
|
|
|
.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
|
|
|
|
.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:
|
|
|
|
.png>)
|
|
|
|
**MD5 Transform**
|
|
|
|
Obratite pažnju na korišćenje više konstanti
|
|
|
|
 (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**:
|
|
|
|
.png>)
|
|
|
|
CRC heš algoritam izgleda ovako:
|
|
|
|
.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:
|
|
|
|
 (2) (1).png>)
|
|
|
|
Proverite **3 poređenja da biste ga prepoznali**:
|
|
|
|
.png>)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|