Cryptographic/Compression Algorithms
Last updated
Last updated
Naučite i vežbajte hakovanje AWS-a:HackTricks Obuka AWS Crveni Tim Stručnjak (ARTE) Naučite i vežbajte hakovanje GCP-a: HackTricks Obuka GCP Crveni Tim Stručnjak (GRTE)
Ako završite u kodu koristeći pomeranja udesno i ulevo, ekskluzivne ili operacije i nekoliko aritmetičkih operacija, vrlo je moguće da je to implementacija kriptografskog algoritma. Ovde će biti prikazane neke metode za identifikaciju algoritma koji se koristi bez potrebe za vraćanjem svakog koraka.
CryptDeriveKey
Ako se koristi ova funkcija, možete pronaći koji algoritam se koristi proverom vrednosti drugog parametra:
Pogledajte ovde tabelu mogućih algoritama i njihove dodeljene vrednosti: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
RtlCompressBuffer/RtlDecompressBuffer
Kompresuje i dekompresuje dati bafer podataka.
CryptAcquireContext
Iz dokumenata: Funkcija CryptAcquireContext se koristi za dobijanje ručke ka određenom kontejneru ključeva unutar određenog provajdera kriptografskih usluga (CSP). Ova vraćena ručka se koristi u pozivima funkcija CryptoAPI koje koriste izabrani CSP.
CryptCreateHash
Pokreće heširanje toka podataka. Ako se koristi ova funkcija, možete pronaći koji algoritam se koristi proverom vrednosti drugog parametra:
Pogledajte ovde tabelu mogućih algoritama i njihove dodeljene vrednosti: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
Ponekad je zaista lako identifikovati algoritam zahvaljujući činjenici da mora koristiti posebnu i jedinstvenu vrednost.
Ako pretražite prvu konstantu na Google-u, dobićete ovo:
Stoga, možete pretpostaviti da je dekompilirana funkcija kalkulator sha256. Možete pretražiti bilo koju od drugih konstanti i dobićete (verovatno) isti rezultat.
Ako kod nema značajne konstante, možda učitava informacije iz odeljka .data. Možete pristupiti tim podacima, grupisati prvi dvojni reč i pretražiti ga na Google-u kao što smo uradili u prethodnom odeljku:
U ovom slučaju, ako potražite 0xA56363C6 možete saznati da je povezano sa tabelama algoritma AES.
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 Substitution Box (ili SBox).
Faza mešanja: Proći će kroz prethodno kreiranu tabelu (petlja od 0x100 iteracija, ponovo) modifikujući svaku vrednost sa polu-slučajnim bajtovima. Da bi se kreirali ovi polu-slučajni bajtovi, koristi se RC4 ključ. RC4 ključevi mogu biti između 1 i 256 bajtova u dužini, međutim obično se preporučuje da bude iznad 5 bajtova. Obično, RC4 ključevi su dužine 16 bajtova.
XOR faza: Na kraju, plain-text ili cipertekst je XOR-ovan sa vrednostima kreiranim pre. Funkcija za šifrovanje i dešifrovanje je ista. Za ovo će se izvršiti petlja kroz kreiranih 256 bajtova koliko god puta je potrebno. Ovo se obično prepoznaje u dekompiliranom kodu sa %256 (mod 256).
Da biste identifikovali RC4 u disasembliranom/dekompiliranom kodu, možete proveriti 2 petlje veličine 0x100 (sa korišćenjem ključa) i zatim XOR ulaznih podataka sa 256 vrednosti kreiranih pre u 2 petlje verovatno koristeći %256 (mod 256)
Korišćenje substitution boxes i lookup tabela
Moguće je razlikovati AES zahvaljujući korišćenju specifičnih vrednosti lookup tabela (konstanti). Imajte na umu da se konstanta može skladištiti u binarnom ili kreirati dinamički.
Ključ za šifrovanje mora biti deljiv sa 16 (obično 32B) i obično se koristi IV od 16B.
Retko je pronaći malver koji ga koristi ali postoje primeri (Ursnif)
Jednostavno je odrediti da li je algoritam Serpent ili ne na osnovu njegove dužine (izuzetno duga funkcija)
U sledećoj slici primetite kako se koristi konstanta 0x9E3779B9 (imajte na umu da se ova konstanta takođe koristi i u drugim kripto algoritmima poput TEA -Tiny Encryption Algorithm). Takođe obratite pažnju na veličinu petlje (132) i broj XOR operacija u instrukcijama disasemblera i u primeru koda:
Kao što je pomenuto ranije, ovaj kod može biti vizualizovan unutar bilo kog dekompajlera kao vrlo duga funkcija jer nema skokova unutar nje. Dekompilirani kod može izgledati ovako:
Stoga je moguće identifikovati ovaj algoritam proverom magičnog broja i početnih XOR-ova, videći vrlo dugu funkciju i upoređujući neke instrukcije iz duge funkcije sa implementacijom (kao što je pomeranje ulevo za 7 i rotacija ulevo za 22).
Složenija od simetričnih algoritama
Nema konstanti! (prilagođene implementacije su teške za određivanje)
KANAL (kripto analizator) ne uspeva da pokaže tragove o RSA jer se oslanja na konstante.
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
3 funkcije: Init, Update, Final
Slične inicijalizacijske funkcije
Init
Možete ih identifikovati proverom konstanti. Imajte na umu da sha_init ima 1 konstantu koju MD5 nema:
MD5 Transform
Primetite korišćenje više konstanti
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)
Proverite konstante u tabeli za pretragu:
Algoritam za CRC heš izgleda ovako:
Nerecognoscibilne konstante
Možete pokušati da napišete algoritam u Pythonu i tražite slične stvari online
Grafikon je prilično velik:
Proverite 3 poređenja da biste ga prepoznali: