E9Patch est un puissant outil de réécriture binaire statique pour les binaires Linux ELF x86_64
. Le patch E9 est :
La réécriture binaire statique prend un binaire d'entrée (exécutable ELF ou objet partagé) et génère un binaire de sortie auquel un correctif/modification est appliqué. Le binaire corrigé peut être utilisé en remplacement de l'original.
Pour plus d'informations, veuillez consulter notre article PLDI'2020 :
Les binaires E9Patch prédéfinis peuvent être téléchargés ici :
Construire E9Patch est très simple : exécutez simplement le script build.sh
.
Cela créera automatiquement deux outils :
e9patch
: le backend du réécrivain binaire ; ete9tool
: une interface de désassemblage linéaire pour E9Patch. E9Patch est utilisable via l'interface E9Tool.
Par exemple, pour ajouter une instrumentation d'impression d'instructions à toutes les instructions xor
dans xterm
, nous pouvons utiliser la commande suivante :
$ ./e9tool -M 'asm=/xor.*/' -P print xterm
Cela générera une version modifiée de xterm
écrite dans le fichier a.out
.
Le xterm
modifié peut être exécuté normalement, mais imprimera la chaîne d'assemblage de chaque instruction xor
exécutée sur stderr
:
$ ./a.out
xorl %ebp, %ebp
xorl %ebx, %ebx
xorl %eax, %eax
xorl %edx, %edx
xorl %edi, %edi
...
Pour une liste complète des options et modes pris en charge, voir :
$ ./e9tool --help
Corrigez toutes les instructions de saut avec une instrumentation « vide » :
$ ./e9tool -M 'asm=/j.*/' -P empty xterm
$ ./a.out
Imprimez toutes les instructions de saut avec l'instrument "imprimer":
$ ./e9tool -M 'asm=/j.*/' -P print xterm
$ ./a.out
Comme ci-dessus, mais utilisez la syntaxe « Intel » :
$ ./e9tool -M 'asm=/j.*/' -P print xterm --syntax=intel
$ ./a.out
Corrigez toutes les instructions de saut avec un appel à une fonction vide :
$ ./e9compile.sh examples/nop.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@nop' xterm
$ ./a.out
Corrigez toutes les instructions de saut avec l'instrumentation du nombre d'instructions :
$ ./e9compile.sh examples/counter.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@counter' xterm
$ FREQ=10000 ./a.out
Corrigez toutes les instructions de saut avec de jolies instruments imprimés :
$ ./e9compile.sh examples/print.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry(addr,instr,size,asm)@print' xterm
$ ./a.out
Patchez toutes les instructions de saut avec une instrumentation "delay" pour ralentir le programme :
$ ./e9compile.sh examples/delay.c
$ ./e9tool -M 'asm=/j.*/' -P 'entry()@delay' xterm
$ DELAY=100000 ./a.out
Remarques :
XTerm(322)
Certains autres projets qui utilisent E9Patch incluent :
libc.so
.E9Patch est un outil de bas niveau conçu pour être intégrable dans d'autres projets. Pour en savoir plus, veuillez consulter la documentation suivante :
Les bugs peuvent être signalés ici :
La version actuelle d'E9Patch est considérablement améliorée par rapport au prototype original évalué dans l'article PLDI'2020. Spécifiquement:
-O2
à E9Tool.Ce logiciel a été publié sous la licence publique GNU (GPL) version 3.
Certains fichiers spécifiques sont publiés sous licence MIT (vérifiez le préambule du fichier).
Ce travail a été partiellement soutenu par le National Satellite of Excellence in Trustworthy Software Systems, financé par la National Research Foundation (NRF) de Singapour dans le cadre du programme National Cybersecurity R&D (NCR).