Cryptographic/Compression Algorithms
Last updated
Last updated
Si vous vous retrouvez avec un code utilisant des décalages à droite et à gauche, des XOR et plusieurs opérations arithmétiques, il est très probable qu'il s'agisse de la mise en œuvre d'un algorithme cryptographique. Voici quelques façons d'identifier l'algorithme utilisé sans avoir besoin de décompiler chaque étape.
CryptDeriveKey
Si cette fonction est utilisée, vous pouvez trouver quel algorithme est utilisé en vérifiant la valeur du deuxième paramètre :
Consultez ici le tableau des algorithmes possibles et de leurs valeurs attribuées : https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
RtlCompressBuffer/RtlDecompressBuffer
Compresse et décompresse un tampon de données donné.
CryptAcquireContext
D'après la documentation : La fonction CryptAcquireContext est utilisée pour acquérir une poignée vers un conteneur de clé particulier dans un fournisseur de services cryptographiques (CSP) particulier. Cette poignée retournée est utilisée dans les appels aux fonctions CryptoAPI qui utilisent le CSP sélectionné.
CryptCreateHash
Initie le hachage d'un flux de données. Si cette fonction est utilisée, vous pouvez trouver quel algorithme est utilisé en vérifiant la valeur du deuxième paramètre :
Consultez ici le tableau des algorithmes possibles et de leurs valeurs attribuées : https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
Parfois, il est vraiment facile d'identifier un algorithme grâce au fait qu'il doit utiliser une valeur spéciale et unique.
Si vous recherchez la première constante sur Google, voici ce que vous obtenez :
Par conséquent, vous pouvez supposer que la fonction décompilée est un calculateur sha256. Vous pouvez rechercher l'une des autres constantes et vous obtiendrez (probablement) le même résultat.
Si le code ne contient aucune constante significative, il se peut qu'il charge des informations à partir de la section .data. Vous pouvez accéder à ces données, grouper le premier double mot et rechercher sur Google comme nous l'avons fait dans la section précédente :
Dans ce cas, si vous recherchez 0xA56363C6, vous pouvez trouver qu'il est lié aux tables de l'algorithme AES.
Il est composé de 3 parties principales :
Étape d'initialisation/ : Crée une table de valeurs de 0x00 à 0xFF (256 octets au total, 0x100). Cette table est communément appelée Boîte de substitution (ou SBox).
Étape de brouillage : Va parcourir la table créée précédemment (boucle de 0x100 itérations, encore une fois) en modifiant chaque valeur avec des octets semi-aléatoires. Pour créer ces octets semi-aléatoires, la clé RC4 est utilisée. Les clés RC4 peuvent être de 1 à 256 octets de longueur, cependant il est généralement recommandé qu'elles dépassent 5 octets. Généralement, les clés RC4 font 16 octets de longueur.
Étape XOR : Enfin, le texte en clair ou le texte chiffré est XORé avec les valeurs créées précédemment. La fonction pour chiffrer et déchiffrer est la même. Pour cela, une boucle à travers les 256 octets créés sera effectuée autant de fois que nécessaire. Cela est généralement reconnu dans un code décompilé avec un %256 (mod 256).
Pour identifier un RC4 dans un code de désassemblage/décompilé, vous pouvez vérifier 2 boucles de taille 0x100 (avec l'utilisation d'une clé) puis un XOR des données d'entrée avec les 256 valeurs créées précédemment dans les 2 boucles en utilisant probablement un %256 (mod 256)
Utilisation de boîtes de substitution et de tables de recherche
Il est possible de distinguer AES grâce à l'utilisation de valeurs spécifiques de tables de recherche (constantes). Notez que la constante peut être stockée dans le binaire ou créée dynamiquement.
La clé de chiffrement doit être divisible par 16 (généralement 32 octets) et généralement un IV de 16 octets est utilisé.
Il est rare de trouver des logiciels malveillants l'utilisant mais il existe des exemples (Ursnif)
Facile à déterminer si un algorithme est Serpent ou non en fonction de sa longueur (fonction extrêmement longue)
Sur l'image suivante, remarquez comment la constante 0x9E3779B9 est utilisée (notez que cette constante est également utilisée par d'autres algorithmes de cryptographie comme TEA - Tiny Encryption Algorithm). Notez également la taille de la boucle (132) et le nombre d'opérations XOR dans les instructions de désassemblage et dans l'exemple de code :
Comme mentionné précédemment, ce code peut être visualisé à l'intérieur de n'importe quel décompilateur comme une fonction très longue car il n'y a pas de sauts à l'intérieur. Le code décompilé peut ressembler à ce qui suit :
Par conséquent, il est possible d'identifier cet algorithme en vérifiant le nombre magique et les XOR initiaux, en voyant une fonction très longue et en comparant certaines instructions de la longue fonction avec une implémentation (comme le décalage à gauche de 7 et la rotation à gauche de 22).
Plus complexe que les algorithmes symétriques
Il n'y a pas de constantes ! (les implémentations personnalisées sont difficiles à déterminer)
KANAL (un analyseur crypto) échoue à montrer des indices sur RSA car il repose sur des constantes.
À la ligne 11 (gauche), il y a un +7) >> 3
qui est le même qu'à la ligne 35 (droite) : +7) / 8
La ligne 12 (gauche) vérifie si modulus_len < 0x040
et à la ligne 36 (droite) elle vérifie si inputLen+11 > modulusLen
3 fonctions : Init, Update, Final
Fonctions d'initialisation similaires
Init
Vous pouvez les identifier tous les deux en vérifiant les constantes. Notez que sha_init a 1 constante que MD5 n'a pas :
Transformation MD5
Notez l'utilisation de plus de constantes
Plus petit et plus efficace car sa fonction est de trouver des changements accidentels dans les données
Utilise des tables de recherche (vous pouvez identifier des constantes)
Vérifiez les constantes des tables de recherche :
Un algorithme de hachage CRC ressemble à :
Pas de constantes reconnaissables
Vous pouvez essayer d'écrire l'algorithme en python et rechercher des choses similaires en ligne
Le graphique est assez grand :
Vérifiez 3 comparaisons pour le reconnaître :