# Kriptografiese/Kompressie Algoritmes {{#include ../../banners/hacktricks-training.md}} ## Identifisering van Algoritmes As jy eindig in 'n kode **wat regte en linke skuif, xors en verskeie aritmetiese operasies** gebruik, is dit hoogs waarskynlik dat dit die implementering van 'n **kriptografiese algoritme** is. Hier gaan daar 'n paar maniere gewys word om die **algoritme wat gebruik word te identifiseer sonder om elke stap te moet omkeer**. ### API funksies **CryptDeriveKey** As hierdie funksie gebruik word, kan jy vind watter **algoritme gebruik word** deur die waarde van die tweede parameter te kontroleer: ![](<../../images/image (375) (1) (1) (1) (1).png>) Kontroleer hier die tabel van moontlike algoritmes en hul toegewyde waardes: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) **RtlCompressBuffer/RtlDecompressBuffer** Komprimeer en dekomprimeer 'n gegewe buffer van data. **CryptAcquireContext** Van [die dokumentasie](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Die **CryptAcquireContext** funksie word gebruik om 'n handvatsel te verkry na 'n spesifieke sleutelhouer binne 'n spesifieke kriptografiese diensverskaffer (CSP). **Hierdie teruggegee handvatsel word gebruik in oproepe na CryptoAPI** funksies wat die geselekteerde CSP gebruik. **CryptCreateHash** Begin die hashing van 'n stroom data. As hierdie funksie gebruik word, kan jy vind watter **algoritme gebruik word** deur die waarde van die tweede parameter te kontroleer: ![](<../../images/image (376).png>) \ Kontroleer hier die tabel van moontlike algoritmes en hul toegewyde waardes: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) ### Kode konstantes Soms is dit regtig maklik om 'n algoritme te identifiseer danksy die feit dat dit 'n spesiale en unieke waarde moet gebruik. ![](<../../images/image (370).png>) As jy die eerste konstante in Google soek, is dit wat jy kry: ![](<../../images/image (371).png>) Daarom kan jy aanvaar dat die dekompilde funksie 'n **sha256 sakrekenaar** is.\ Jy kan enige van die ander konstantes soek en jy sal (waarskynlik) dieselfde resultaat verkry. ### data info As die kode geen betekenisvolle konstante het nie, kan dit **inligting van die .data afdeling laai**.\ Jy kan daardie data toegang, **die eerste dword groepeer** en dit in Google soek soos ons in die vorige afdeling gedoen het: ![](<../../images/image (372).png>) In hierdie geval, as jy soek vir **0xA56363C6** kan jy vind dat dit verband hou met die **tabelle van die AES algoritme**. ## RC4 **(Simmetriese Kriptografie)** ### Kenmerke Dit bestaan uit 3 hoofdele: - **Inisialisering fase/**: Skep 'n **tabel van waardes van 0x00 tot 0xFF** (256bytes in totaal, 0x100). Hierdie tabel word algemeen die **Substitusie Boks** (of SBox) genoem. - **Hussel fase**: Sal **deur die tabel** wat voorheen geskep is (lus van 0x100 iterasies, weer) loop en elke waarde met **semi-ewe random** bytes modifiseer. Om hierdie semi-ewe random bytes te skep, word die RC4 **sleutel gebruik**. RC4 **sleutels** kan **tussen 1 en 256 bytes in lengte** wees, maar dit word gewoonlik aanbeveel dat dit bo 5 bytes is. Gewoonlik is RC4 sleutels 16 bytes in lengte. - **XOR fase**: Laastens, die plain-text of cyphertext word **XORed met die waardes wat voorheen geskep is**. Die funksie om te enkripteer en te dekripteer is dieselfde. Hiervoor sal 'n **lus deur die geskepte 256 bytes** uitgevoer word soveel keer as wat nodig is. Dit word gewoonlik in 'n dekompilde kode erken met 'n **%256 (mod 256)**. > [!TIP] > **Om 'n RC4 in 'n disassembly/dekompilde kode te identifiseer, kan jy kyk vir 2 lusse van grootte 0x100 (met die gebruik van 'n sleutel) en dan 'n XOR van die invoerdata met die 256 waardes wat voorheen in die 2 lusse geskep is, waarskynlik met 'n %256 (mod 256)** ### **Inisialisering fase/Substitusie Boks:** (Let op die nommer 256 wat as teenwoordiger gebruik word en hoe 'n 0 in elke plek van die 256 karakters geskryf word) ![](<../../images/image (377).png>) ### **Hussel Fase:** ![](<../../images/image (378).png>) ### **XOR Fase:** ![](<../../images/image (379).png>) ## **AES (Simmetriese Kriptografie)** ### **Kenmerke** - Gebruik van **substitusie bokse en opsoek tabelle** - Dit is moontlik om **AES te onderskei danksy die gebruik van spesifieke opsoek tabel waardes** (konstantes). _Let daarop dat die **konstante** **gestoor** kan word in die binĂªre **of geskep** _ _**dynamies**._ - Die **enkripsiesleutel** moet **deelbaar** wees deur **16** (gewoonlik 32B) en gewoonlik word 'n **IV** van 16B gebruik. ### SBox konstantes ![](<../../images/image (380).png>) ## Serpent **(Simmetriese Kriptografie)** ### Kenmerke - Dit is selde om sekere malware wat dit gebruik te vind, maar daar is voorbeelde (Ursnif) - Eenvoudig om te bepaal of 'n algoritme Serpent is of nie gebaseer op sy lengte (uiters lang funksie) ### Identifisering In die volgende beeld let op hoe die konstante **0x9E3779B9** gebruik word (let daarop dat hierdie konstante ook deur ander kripto algoritmes soos **TEA** -Tiny Encryption Algorithm gebruik word).\ Let ook op die **grootte van die lus** (**132**) en die **aantal XOR operasies** in die **disassembly** instruksies en in die **kode** voorbeeld: ![](<../../images/image (381).png>) Soos voorheen genoem, kan hierdie kode binne enige dekompiler as 'n **baie lange funksie** gesien word aangesien daar **nie spronge** binne dit is nie. Die dekompilde kode kan soos volg lyk: ![](<../../images/image (382).png>) Daarom is dit moontlik om hierdie algoritme te identifiseer deur die **magiese nommer** en die **begin XORs** te kontroleer, 'n **baie lange funksie** te sien en **instruksies** van die lange funksie **te vergelyk** met 'n implementering (soos die skuif links deur 7 en die draai links deur 22). ## RSA **(Asimmetriese Kriptografie)** ### Kenmerke - Meer kompleks as simmetriese algoritmes - Daar is geen konstantes nie! (aangepaste implementasies is moeilik om te bepaal) - KANAL (n kripto ontleder) slaag nie daarin om leidrade oor RSA te wys nie en dit staatmaak op konstantes. ### Identifisering deur vergelykings ![](<../../images/image (383).png>) - In lyn 11 (links) is daar 'n `+7) >> 3` wat dieselfde is as in lyn 35 (regs): `+7) / 8` - Lyn 12 (links) kontroleer of `modulus_len < 0x040` en in lyn 36 (regs) kontroleer dit of `inputLen+11 > modulusLen` ## MD5 & SHA (hash) ### Kenmerke - 3 funksies: Init, Update, Final - Soortgelyke inisialisering funksies ### Identifiseer **Init** Jy kan albei identifiseer deur die konstantes te kontroleer. Let daarop dat die sha_init 'n konstante het wat MD5 nie het nie: ![](<../../images/image (385).png>) **MD5 Transform** Let op die gebruik van meer konstantes ![](<../../images/image (253) (1) (1) (1).png>) ## CRC (hash) - Kleiner en meer doeltreffend aangesien dit se funksie is om toevallige veranderinge in data te vind - Gebruik opsoek tabelle (sodat jy konstantes kan identifiseer) ### Identifiseer Kontroleer **opsoek tabel konstantes**: ![](<../../images/image (387).png>) 'n CRC hash algoritme lyk soos: ![](<../../images/image (386).png>) ## APLib (Kompressie) ### Kenmerke - Nie herkenbare konstantes - Jy kan probeer om die algoritme in python te skryf en soortgelyke dinge aanlyn te soek ### Identifiseer Die grafiek is redelik groot: ![](<../../images/image (207) (2) (1).png>) Kontroleer **3 vergelykings om dit te herken**: ![](<../../images/image (384).png>) {{#include ../../banners/hacktricks-training.md}}