# Κρυπτογραφικοί/Αλγόριθμοι Συμπίεσης {{#include ../../banners/hacktricks-training.md}} ## Αναγνώριση Αλγορίθμων Αν καταλήγεις σε έναν κώδικα **χρησιμοποιώντας μετατοπίσεις δεξιά και αριστερά, xors και διάφορες αριθμητικές λειτουργίες** είναι πολύ πιθανό να είναι η υλοποίηση ενός **κρυπτογραφικού αλγορίθμου**. Εδώ θα παρουσιαστούν μερικοί τρόποι για να **αναγνωρίσεις τον αλγόριθμο που χρησιμοποιείται χωρίς να χρειάζεται να αναστρέψεις κάθε βήμα**. ### Λειτουργίες API **CryptDeriveKey** Αν αυτή η λειτουργία χρησιμοποιείται, μπορείς να βρεις ποιος **αλγόριθμος χρησιμοποιείται** ελέγχοντας την τιμή της δεύτερης παραμέτρου: ![](<../../images/image (375) (1) (1) (1) (1).png>) Έλεγξε εδώ τον πίνακα των πιθανών αλγορίθμων και των ανατεθειμένων τιμών τους: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) **RtlCompressBuffer/RtlDecompressBuffer** Συμπιέζει και αποσυμπιέζει ένα δεδομένο buffer δεδομένων. **CryptAcquireContext** Από [τα docs](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Η λειτουργία **CryptAcquireContext** χρησιμοποιείται για να αποκτήσει ένα handle σε ένα συγκεκριμένο container κλειδιών μέσα σε έναν συγκεκριμένο πάροχο κρυπτογραφικών υπηρεσιών (CSP). **Αυτό το επιστρεφόμενο handle χρησιμοποιείται σε κλήσεις σε λειτουργίες CryptoAPI** που χρησιμοποιούν τον επιλεγμένο CSP. **CryptCreateHash** Αρχίζει την καταμέτρηση ενός ρεύματος δεδομένων. Αν αυτή η λειτουργία χρησιμοποιείται, μπορείς να βρεις ποιος **αλγόριθμος χρησιμοποιείται** ελέγχοντας την τιμή της δεύτερης παραμέτρου: ![](<../../images/image (376).png>) \ Έλεγξε εδώ τον πίνακα των πιθανών αλγορίθμων και των ανατεθειμένων τιμών τους: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) ### Σταθερές Κώδικα Μερικές φορές είναι πολύ εύκολο να αναγνωρίσεις έναν αλγόριθμο χάρη στο γεγονός ότι χρειάζεται να χρησιμοποιήσει μια ειδική και μοναδική τιμή. ![](<../../images/image (370).png>) Αν ψάξεις για την πρώτη σταθερά στο Google αυτό είναι που θα βρεις: ![](<../../images/image (371).png>) Επομένως, μπορείς να υποθέσεις ότι η αποσυμπιεσμένη λειτουργία είναι ένας **υπολογιστής sha256.**\ Μπορείς να ψάξεις οποιαδήποτε από τις άλλες σταθερές και θα αποκτήσεις (πιθανώς) το ίδιο αποτέλεσμα. ### πληροφορίες δεδομένων Αν ο κώδικας δεν έχει καμία σημαντική σταθερά μπορεί να είναι **φορτώνοντας πληροφορίες από την ενότητα .data**.\ Μπορείς να έχεις πρόσβαση σε αυτά τα δεδομένα, **ομαδοποιώντας το πρώτο dword** και ψάχνοντας το στο Google όπως κάναμε στην προηγούμενη ενότητα: ![](<../../images/image (372).png>) Σε αυτή την περίπτωση, αν ψάξεις για **0xA56363C6** μπορείς να βρεις ότι σχετίζεται με τους **πίνακες του αλγορίθμου AES**. ## RC4 **(Συμμετρική Κρυπτογράφηση)** ### Χαρακτηριστικά Αποτελείται από 3 κύρια μέρη: - **Στάδιο Αρχικοποίησης/**: Δημιουργεί έναν **πίνακα τιμών από 0x00 έως 0xFF** (256bytes συνολικά, 0x100). Αυτός ο πίνακας ονομάζεται συνήθως **Substitution Box** (ή SBox). - **Στάδιο Ανακατανομής**: Θα **περάσει από τον πίνακα** που δημιουργήθηκε πριν (κύκλος 0x100 επαναλήψεων, ξανά) τροποποιώντας κάθε τιμή με **ημι-τυχαία** bytes. Για να δημιουργηθούν αυτά τα ημι-τυχαία bytes, χρησιμοποιείται το κλειδί RC4. Τα **κλειδιά RC4** μπορούν να είναι **μεταξύ 1 και 256 bytes σε μήκος**, ωστόσο συνήθως συνιστάται να είναι πάνω από 5 bytes. Συνήθως, τα κλειδιά RC4 είναι 16 bytes σε μήκος. - **Στάδιο XOR**: Τέλος, το απλό κείμενο ή το κρυπτογραφημένο κείμενο **XORed με τις τιμές που δημιουργήθηκαν πριν**. Η λειτουργία για την κρυπτογράφηση και την αποκρυπτογράφηση είναι η ίδια. Για αυτό, θα εκτελεστεί ένας **κύκλος μέσα από τα δημιουργημένα 256 bytes** όσες φορές είναι απαραίτητο. Αυτό συνήθως αναγνωρίζεται σε έναν αποσυμπιεσμένο κώδικα με ένα **%256 (mod 256)**. > [!TIP] > **Για να αναγνωρίσεις ένα RC4 σε έναν αποσυμπιεσμένο/αποσυμπιεσμένο κώδικα μπορείς να ελέγξεις για 2 κύκλους μεγέθους 0x100 (με τη χρήση ενός κλειδιού) και στη συνέχεια ένα XOR των δεδομένων εισόδου με τις 256 τιμές που δημιουργήθηκαν πριν στους 2 κύκλους πιθανώς χρησιμοποιώντας ένα %256 (mod 256)** ### **Στάδιο Αρχικοποίησης/Πίνακας Υποκατάστασης:** (Σημείωσε τον αριθμό 256 που χρησιμοποιείται ως μετρητής και πώς γράφεται ένα 0 σε κάθε θέση των 256 χαρακτήρων) ![](<../../images/image (377).png>) ### **Στάδιο Ανακατανομής:** ![](<../../images/image (378).png>) ### **Στάδιο XOR:** ![](<../../images/image (379).png>) ## **AES (Συμμετρική Κρυπτογράφηση)** ### **Χαρακτηριστικά** - Χρήση **πινακων υποκατάστασης και πινάκων αναζήτησης** - Είναι δυνατόν να **διακρίνεις το AES χάρη στη χρήση συγκεκριμένων τιμών πίνακα αναζήτησης** (σταθερές). _Σημείωσε ότι η **σταθερά** μπορεί να είναι **αποθηκευμένη** στο δυαδικό **ή να δημιουργείται** _**δυναμικά**._ - Το **κλειδί κρυπτογράφησης** πρέπει να είναι **διαιρέσιμο** με **16** (συνήθως 32B) και συνήθως χρησιμοποιείται ένα **IV** 16B. ### Σταθερές SBox ![](<../../images/image (380).png>) ## Serpent **(Συμμετρική Κρυπτογράφηση)** ### Χαρακτηριστικά - Είναι σπάνιο να βρεις κάποιο malware που να το χρησιμοποιεί αλλά υπάρχουν παραδείγματα (Ursnif) - Απλό να προσδιορίσεις αν ένας αλγόριθμος είναι Serpent ή όχι με βάση το μήκος του (εξαιρετικά μεγάλη λειτουργία) ### Αναγνώριση Στην παρακάτω εικόνα παρατήρησε πώς χρησιμοποιείται η σταθερά **0x9E3779B9** (σημείωσε ότι αυτή η σταθερά χρησιμοποιείται επίσης από άλλους κρυπτογραφικούς αλγορίθμους όπως **TEA** -Tiny Encryption Algorithm).\ Επίσης σημείωσε το **μέγεθος του κύκλου** (**132**) και τον **αριθμό των λειτουργιών XOR** στις **εντολές αποσυμπίεσης** και στο **παράδειγμα κώδικα**: ![](<../../images/image (381).png>) Όπως αναφέρθηκε προηγουμένως, αυτός ο κώδικας μπορεί να οπτικοποιηθεί μέσα σε οποιονδήποτε αποσυμπιεστή ως μια **πολύ μεγάλη λειτουργία** καθώς **δεν υπάρχουν άλματα** μέσα σε αυτόν. Ο αποσυμπιεσμένος κώδικας μπορεί να φαίνεται όπως το εξής: ![](<../../images/image (382).png>) Επομένως, είναι δυνατόν να αναγνωρίσεις αυτόν τον αλγόριθμο ελέγχοντας τον **μαγικό αριθμό** και τους **αρχικούς XORs**, βλέποντας μια **πολύ μεγάλη λειτουργία** και **συγκρίνοντας** κάποιες **εντολές** της μεγάλης λειτουργίας **με μια υλοποίηση** (όπως η μετατόπιση αριστερά κατά 7 και η περιστροφή αριστερά κατά 22). ## RSA **(Ασύμμετρη Κρυπτογράφηση)** ### Χαρακτηριστικά - Πιο περίπλοκος από τους συμμετρικούς αλγορίθμους - Δεν υπάρχουν σταθερές! (οι προσαρμοσμένες υλοποιήσεις είναι δύσκολο να προσδιοριστούν) - Ο KANAL (ένας αναλυτής κρυπτογράφησης) αποτυγχάνει να δείξει ενδείξεις για το RSA καθώς βασίζεται σε σταθερές. ### Αναγνώριση μέσω συγκρίσεων ![](<../../images/image (383).png>) - Στη γραμμή 11 (αριστερά) υπάρχει ένα `+7) >> 3` που είναι το ίδιο με τη γραμμή 35 (δεξιά): `+7) / 8` - Η γραμμή 12 (αριστερά) ελέγχει αν `modulus_len < 0x040` και στη γραμμή 36 (δεξιά) ελέγχει αν `inputLen+11 > modulusLen` ## MD5 & SHA (hash) ### Χαρακτηριστικά - 3 λειτουργίες: Init, Update, Final - Παρόμοιες λειτουργίες αρχικοποίησης ### Αναγνώριση **Init** Μπορείς να αναγνωρίσεις και τους δύο ελέγχοντας τις σταθερές. Σημείωσε ότι η sha_init έχει 1 σταθερά που δεν έχει το MD5: ![](<../../images/image (385).png>) **MD5 Transform** Σημείωσε τη χρήση περισσότερων σταθερών ![](<../../images/image (253) (1) (1) (1).png>) ## CRC (hash) - Μικρότερος και πιο αποδοτικός καθώς η λειτουργία του είναι να βρίσκει τυχαίες αλλαγές στα δεδομένα - Χρησιμοποιεί πίνακες αναζήτησης (έτσι μπορείς να αναγνωρίσεις σταθερές) ### Αναγνώριση Έλεγξε **σταθερές πίνακα αναζήτησης**: ![](<../../images/image (387).png>) Ένας αλγόριθμος hash CRC μοιάζει με: ![](<../../images/image (386).png>) ## APLib (Συμπίεση) ### Χαρακτηριστικά - Μη αναγνωρίσιμες σταθερές - Μπορείς να προσπαθήσεις να γράψεις τον αλγόριθμο σε python και να ψάξεις για παρόμοια πράγματα online ### Αναγνώριση Ο γραφικός πίνακας είναι αρκετά μεγάλος: ![](<../../images/image (207) (2) (1).png>) Έλεγξε **3 συγκρίσεις για να τον αναγνωρίσεις**: ![](<../../images/image (384).png>) {{#include ../../banners/hacktricks-training.md}}