Un packer ou un protecteur binaire est un moyen de protéger les logiciels de l'ingénierie inverse. Les auteurs de malwares utilisent des packers pour échapper à la détection basée sur les signatures, par exemple pour contrecarrer RE. Une partie importante du packer est le code de stub pour restaurer le binaire protégé, qui incorpore généralement des techniques telles que l'anti-débogage, l'anti-VM et l'anti-émulateur qui interfèrent avec l'analyse.
Les décompresseurs sont implémentés dans certains logiciels antivirus. Autant que je sache, Kaspersky et Norton. Un décompresseur est un programme qui décompresse un programme compressé, c'est-à-dire extrait le binaire d'origine. Il existe des décompresseurs qui ne peuvent être décompressés que par un packer spécifique, et des décompresseurs qui peuvent être décompressés même s'il n'y a pas d'informations sur le packer à l'avance, comme la façon dont le packer restaure le programme. C'est ce qu'on appelle un décompresseur général. Des recherches sur les décompresseurs à usage général sont menées depuis 2005 environ et OmniUnpack, PolyUnpack, Pindemonium, Renovo, RAMBO, etc.
Les emballeurs PE bien connus incluent UPX et Armadillo, mais peu sont réellement disponibles en ELF. Si c'est au stade POC ou simplement expliqué sur la diapositive, il y a Shiva, Burneye, Maya's Veil et ainsi de suite. Je vous recommande de jeter un œil à Maya's Veil.
Si vous souhaitez créer un packer avec ELF, Announcing Userland Exec est une bonne référence. Jetez également un œil à Modern Userland Exec.
À l'origine, le packer devrait restaurer le programme d'origine en mémoire et lui transférer l'exécution. Mais cette fois, j'écris le binaire sur le disque et j'exécute le binaire d'origine avec execve (). La fonction d'emballeur n'est pas bonne, mais je vais commencer par une simple. De cette façon, vous devriez pouvoir emballer les deux programmes 32 bits / 64 bits. Si vous ne savez rien sur ELF, je vous recommande de regarder d'abord la référence. Ce qui suit est une image de l'emballage du binaire que vous souhaitez protéger. Le côté gauche est la structure d'un binaire ELF normal, et le côté droit est l'état où le binaire est stocké. Il y a probablement plusieurs façons de stocker le binaire, mais cette fois je vais étendre le segment de données et y placer le binaire.
Pour cela, il est nécessaire de changer la valeur du membre de l'en-tête de programme du segment de données. Plus précisément, tout ce que vous avez à faire est d'ajouter la taille du binaire que vous souhaitez stocker dans p_filesz et p_memsz dans l'en-tête du programme du segment de données binaire stub. Le code de stub doit connaître son décalage et sa taille afin de restaurer le code d'origine. Ils sont ajoutés après le code d'origine. Par conséquent, la structure finale est la suivante.
Comme j'ai oublié de le dire, n'oubliez pas d'ajouter ces tailles à p_filesz et p_memsz pour stocker les tailles et les décalages. De plus, j'ai oublié de le dessiner sur la figure, mais le code de stub doit également connaître la clé pour restaurer le code d'origine crypté. Ajoutez la taille pour cela. Autrement dit, la taille du segment de données d'origine + la taille de la taille + la taille du décalage + la taille de la clé correspond à la taille du segment de données final. Après cela, extrayez le binaire de votre propre segment de données, écrivez-le sur le disque et écrivez le code de stub pour exécuter le programme en utilisant execve (). Le code pour y parvenir peut être trouvé sur GitHub. Linux devrait probablement fonctionner correctement.
Téléchargez le code et tapez make pour créer un fichier appelé wrapper.
Il peut être compressé avec "./wrapper le binaire que vous voulez compresser" et un exécutable appelé binaire est généré. Le code a été écrit en quelques heures et n'est pas encore complet (je ne veux pas). Il est presque griffonné, vous verrez donc des fonctions en double et des options obscures, mais vous comprendrez l'idée d'empaqueter des binaires. (Ensuite, je ferai quelque chose de plus décent)
Recommended Posts