184 lines
7.2 KiB
Markdown

# Cryptographic/Compression Algorithms
{{#include ../../banners/hacktricks-training.md}}
## Identifying Algorithms
Ikiwa unamaliza katika msimbo **ukitumia shift rights and lefts, xors na operesheni kadhaa za hesabu** ni uwezekano mkubwa kwamba ni utekelezaji wa **cryptographic algorithm**. Hapa kuna njia kadhaa za **kutambua algorithm inayotumika bila kuhitaji kubadilisha kila hatua**.
### API functions
**CryptDeriveKey**
Ikiwa kazi hii inatumika, unaweza kupata ni **algorithm gani inayotumika** ukichunguza thamani ya parameter ya pili:
![](<../../images/image (156).png>)
Angalia hapa jedwali la algorithms zinazowezekana na thamani zao zilizotolewa: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
**RtlCompressBuffer/RtlDecompressBuffer**
Inabana na kufungua buffer fulani ya data.
**CryptAcquireContext**
Kutoka [the docs](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Kazi ya **CryptAcquireContext** inatumika kupata mkono wa container maalum ya funguo ndani ya mtoa huduma maalum wa cryptographic (CSP). **Huu mkono uliorejeshwa unatumika katika wito wa kazi za CryptoAPI** zinazotumia CSP iliyochaguliwa.
**CryptCreateHash**
Inaanzisha hashing ya mtiririko wa data. Ikiwa kazi hii inatumika, unaweza kupata ni **algorithm gani inayotumika** ukichunguza thamani ya parameter ya pili:
![](<../../images/image (549).png>)
\
Angalia hapa jedwali la algorithms zinazowezekana na thamani zao zilizotolewa: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
### Code constants
Wakati mwingine ni rahisi sana kutambua algorithm kutokana na ukweli kwamba inahitaji kutumia thamani maalum na ya kipekee.
![](<../../images/image (833).png>)
Ikiwa unatafuta constant ya kwanza kwenye Google hii ndiyo unapata:
![](<../../images/image (529).png>)
Kwa hivyo, unaweza kudhani kwamba kazi iliyotolewa ni **sha256 calculator.**\
Unaweza kutafuta yoyote ya constants nyingine na utapata (labda) matokeo sawa.
### data info
Ikiwa msimbo huna constant yoyote muhimu inaweza kuwa **inapakia habari kutoka sehemu ya .data**.\
Unaweza kufikia data hiyo, **kundi la dword ya kwanza** na kutafuta katika google kama tulivyofanya katika sehemu iliyopita:
![](<../../images/image (531).png>)
Katika kesi hii, ikiwa utaangalia **0xA56363C6** unaweza kupata kwamba inahusiana na **meza za algorithm ya AES**.
## RC4 **(Symmetric Crypt)**
### Characteristics
Imepangwa kwa sehemu 3 kuu:
- **Initialization stage/**: Inaunda **meza ya thamani kutoka 0x00 hadi 0xFF** (256bytes kwa jumla, 0x100). Meza hii kwa kawaida inaitwa **Substitution Box** (au SBox).
- **Scrambling stage**: Itafanya **mzunguko kupitia meza** iliyoundwa hapo awali (mzunguko wa 0x100 iterations, tena) ikibadilisha kila thamani kwa **bytes za nadharia**. Ili kuunda hizi bytes za nadharia, funguo ya RC4 **inatumika**. Funguo za RC4 zinaweza kuwa **kati ya 1 na 256 bytes kwa urefu**, hata hivyo kawaida inapendekezwa iwe juu ya 5 bytes. Kwa kawaida, funguo za RC4 ni 16 bytes kwa urefu.
- **XOR stage**: Hatimaye, maandiko ya wazi au cyphertext **yanapigwa XOR na thamani zilizoundwa hapo awali**. Kazi ya kuandika na kufungua ni ile ile. Kwa hili, **mzunguko kupitia bytes 256 zilizoundwa** utafanywa mara nyingi kadri inavyohitajika. Hii kwa kawaida inatambuliwa katika msimbo uliotolewa na **%256 (mod 256)**.
> [!TIP]
> **Ili kutambua RC4 katika msimbo wa disassembly/decompiled unaweza kuangalia kwa mizunguko 2 ya ukubwa 0x100 (kwa kutumia funguo) na kisha XOR ya data ya ingizo na thamani 256 zilizoundwa hapo awali katika mizunguko 2 labda kwa kutumia %256 (mod 256)**
### **Initialization stage/Substitution Box:** (Angalia nambari 256 inayotumika kama hesabu na jinsi 0 inavyoandikwa katika kila mahali pa wahusika 256)
![](<../../images/image (584).png>)
### **Scrambling Stage:**
![](<../../images/image (835).png>)
### **XOR Stage:**
![](<../../images/image (904).png>)
## **AES (Symmetric Crypt)**
### **Characteristics**
- Matumizi ya **substitution boxes na lookup tables**
- Inawezekana **kutofautisha AES kutokana na matumizi ya thamani maalum za lookup table** (constants). _Kumbuka kwamba **constant** inaweza **kuhifadhiwa** katika binary **au kuundwa** _**dynamically**._
- Funguo ya **encryption** lazima iwe **inaweza kugawanywa** kwa **16** (kawaida 32B) na kawaida **IV** ya 16B inatumika.
### SBox constants
![](<../../images/image (208).png>)
## Serpent **(Symmetric Crypt)**
### Characteristics
- Ni nadra kupata malware ikitumia lakini kuna mifano (Ursnif)
- Rahisi kubaini ikiwa algorithm ni Serpent au la kulingana na urefu wake (kazi ndefu sana)
### Identifying
Katika picha ifuatayo angalia jinsi constant **0x9E3779B9** inavyotumika (kumbuka kwamba constant hii pia inatumika na algorithms nyingine za crypto kama **TEA** -Tiny Encryption Algorithm).\
Pia angalia **ukubwa wa mzunguko** (**132**) na **idadi ya operesheni za XOR** katika **maagizo ya disassembly** na katika **mfano wa msimbo**:
![](<../../images/image (547).png>)
Kama ilivyotajwa hapo awali, msimbo huu unaweza kuonyeshwa ndani ya decompiler yoyote kama **kazi ndefu sana** kwani **hakuna kuruka** ndani yake. Msimbo uliotolewa unaweza kuonekana kama ifuatavyo:
![](<../../images/image (513).png>)
Kwa hivyo, inawezekana kutambua algorithm hii ukichunguza **nambari ya uchawi** na **XORs za awali**, kuona **kazi ndefu sana** na **kulinganisha** baadhi ya **maagizo** ya kazi ndefu **na utekelezaji** (kama shift left kwa 7 na rotate left kwa 22).
## RSA **(Asymmetric Crypt)**
### Characteristics
- Ngumu zaidi kuliko algorithms za symmetric
- Hakuna constants! (utekelezaji wa kawaida ni mgumu kubaini)
- KANAL (mchambuzi wa crypto) inashindwa kuonyesha vidokezo juu ya RSA kwani inategemea constants.
### Identifying by comparisons
![](<../../images/image (1113).png>)
- Katika mstari wa 11 (kushoto) kuna `+7) >> 3` ambayo ni sawa na katika mstari wa 35 (kulia): `+7) / 8`
- Mstari wa 12 (kushoto) unakagua ikiwa `modulus_len < 0x040` na katika mstari wa 36 (kulia) inakagua ikiwa `inputLen+11 > modulusLen`
## MD5 & SHA (hash)
### Characteristics
- Kazi 3: Init, Update, Final
- Kazi za kuanzisha zinazofanana
### Identify
**Init**
Unaweza kutambua zote mbili ukichunguza constants. Kumbuka kwamba sha_init ina constant 1 ambayo MD5 haina:
![](<../../images/image (406).png>)
**MD5 Transform**
Kumbuka matumizi ya constants zaidi
![](<../../images/image (253) (1) (1).png>)
## CRC (hash)
- Ndogo na yenye ufanisi kwani kazi yake ni kupata mabadiliko yasiyokusudiwa katika data
- Inatumia lookup tables (hivyo unaweza kutambua constants)
### Identify
Angalia **lookup table constants**:
![](<../../images/image (508).png>)
Algorithm ya CRC hash inaonekana kama:
![](<../../images/image (391).png>)
## APLib (Compression)
### Characteristics
- Hakuna constants zinazotambulika
- Unaweza kujaribu kuandika algorithm hiyo katika python na kutafuta mambo yanayofanana mtandaoni
### Identify
Grafu ni kubwa sana:
![](<../../images/image (207) (2) (1).png>)
Angalia **kulinganisha 3 kutambua**:
![](<../../images/image (430).png>)
{{#include ../../banners/hacktricks-training.md}}