Suite des techniques d’obfuscation.
Forced inlining
- Implémentation : utiliser des optimisations de compilateur pour forcer l’intégration de certaines fonctions.
- Difficulté : rend le flot de contrôle plus complexe et dissimule les limites de la fonction.
- Exemple : utiliser
__attribute__((always_inline))en C pour forcer l’inline.
Return hijack (stack pivot)
- Implémentation : altérer le retour de la fonction ou réorganiser la pile.
- Difficulté d’analyse : déroutant pour les décompilateurs, car le flot de contrôle n’est pas conventionnel.
- Exemple :
xchg esp, eax; ret; - Ressources : https://blog.ret2.io/.
Code morphing
- Implémentation : le code s’auto-modifie à l’exécution.
- Difficulté d’analyse : le code change constamment, rendant l’analyse statique non fiable.
- Exemple : générer du code avec un polymorphisme simple en C.
Compilation obfusquée
obfuscator-llvm.
Symbol renaming / shuffling
Stripping et renaming sont mutuellement exclusifs.
Static linking
Édition de liens statique, qui noie le code propre au programme dans celui des bibliothèques.
Obfuscation des littérales
Changer les valeurs constantes en calculs, en appels de fonction ou en chaînes XOR-ées.
API obfuscation
Renommer ou créer des wrappers autour des appels API.
Anti-débogage
Check common debuggers in parent proc
Examiner le processus parent pour détecter des débogueurs communs. Difficulté : peut empêcher les débogueurs de s’exécuter.
PTRACE_TRACEME
Runtime integrity checks
Comment GDB est-il capable de stopper l'exécution ?
GDB possède une copie en lecture/écriture du code, dans laquelle il insère une instruction de trappe (
int3sur x86) à l’emplacement du point d’arrêt.
Certaines de ces techniques sont plus furtives que d’autres. L’obfuscation peut inciter à creuser, en mettant le doigt sur des données sensibles. Il peut être plus judicieux d’utiliser des techniques plus fines, ou de réduire l’obfuscation.