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 (int3 sur 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.