
Un simple injecteur de bibliothèques partagées sans ptrace pour Linux x64
Un injecteur de bibliothèques partagées simple, sans ptrace, pour Linux x64.
linux_injector <mode> <pid> <file>
mode
pid
Identifiant du processus cible. Vous devez disposer des droits ptrace sur ce processus (nécessaire pour accéder à /proc/$pid/mem). Il n'est pas ptracé, un autre processus peut donc librement le ptracer.
fichier
Pour le mode 1 : module à injecter, qui sera chargé via dlopen dans le processus distant. Il vaut mieux utiliser un chemin complet, car le LD_LIBRARY_PATH distant est utilisé pour la résolution sinon.
Pour le mode 2 : module à injecter, qui sera chargé via dlopen dans le processus distant depuis un memfd dans lequel le contenu sera copié.
Pour le mode 3 : shellcode brut à injecter. Le shellcode sera mappé sur une adresse alignée sur 16 octets, et l'exécution démarrera sur un thread détourné au hasard. Placez des hooks ou créez un thread, puis revenez.
Pour le détournement de flux de contrôle, ce programme a besoin d'un candidat au détournement. Le code présenté ici utilise malloc ; cela peut être modifié en éditant FUN_NAME et en recompilant. Assurez-vous que la fonction hookée peut s'exécuter en moins de 100 ms, afin qu'elle ne soit pas écrasée pendant son exécution. Cela signifie que des appels comme sleep ou wait sont de mauvais candidats pour le shellcode initial. La fonction en question doit également faire plus de 0x50 octets de long pour que le shellcode n'écrase pas d'autres fonctions.
Glibc et musl sont pris en charge à la fois pour le processus cible et le processus source. Le processus cible peut être exécuté dans un conteneur et peut utiliser une libc différente. Les modes 2 et 3 ne nécessitent aucun chemin accessible au processus cible.
Le mode 2 nécessite Linux 3.17.
Testé sur Oracle Linux 7 (mode 2 non pris en charge), Fedora 37 et Alpine Linux 3.17