[LINUX] Créer un packer ELF rudimentaire

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.

20190107153129.png                                   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.

20190107154440.png                                                         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

Créer un packer ELF rudimentaire
Créer un planning Django
Créer un module Python
Créer un LV amorçable
Créer un environnement Python
Créer un bot slack
Créer un référentiel pypi local
Créer un dictionnaire en Python
Créer un serveur REST (simple)
Créer une page d'accueil avec django
Créer un tableau numpy python
Créer un fichier de données factice
Créer un écran de connexion Django
Créer une salle de classe sur Jupyterhub
Créer un serveur textlint simple
Créer un répertoire avec python
Créer un lecteur CSV avec Flask
Créer une interface graphique python à l'aide de tkinter
Créer un conteneur DI avec Python
Étapes pour créer un projet Django
Créez un Dataframe pandas à partir d'une chaîne.
Créer un dictionnaire imbriqué à l'aide de defaultdict
Comment créer un package Conda
Créez un environnement virtuel avec Python!
Créer un fichier binaire en Python
Créer un service SlackBot sur Pepper
Créer un environnement Linux sur Windows 10
Créer un environnement python dans centos
Comment créer un Dockerfile (basique)
Créer un serveur de socket de domaine Unix
Créer un fichier de nombres aléatoires de 1 Mo
Créer un framework de décorateur à usage général pour Python
5 façons de créer un chatbot Python
Créer une API CRUD à l'aide de l'API rapide
Créez un stepper de poisson avec numpy.random
Créer une chaîne aléatoire en Python
Comment créer un fichier de configuration
Créez un wrapper de langage C à l'aide de Boost.Python
Créer un téléchargeur de fichiers avec Django