Introduction
Les traducteurs de binaires sont des outils essentiels pour exécuter des programmes conçus pour une architecture sur une autre. Cependant, la plupart de ces outils reposent sur des heuristiques ou des mécanismes de secours pour gérer les erreurs de décodage. Nous présentons ici Elevator, le premier traducteur binaire qui peut traduire de manière statique et déterministe des exécutables x86-64 complets en AArch64 sans informations de débogage, code source ou hypothèses sur la disposition du code.
Contexte Technique
Elevator fonctionne en considérant toutes les interprétations possibles de chaque octet du code source et en produisant une traduction séparée pour chacune d'elles. Cela signifie que chaque octet peut être interprété comme des données, un opcode ou un argument d'opcode, et que des chemins de flux de contrôle séparés sont générés pour toutes les interprétations, en éliminant uniquement celles qui mènent à une terminaison anormale. Les traductions sont construites en composant des « tuiles » de code dérivées automatiquement à partir d'une description de haut niveau de l'ISA source.
Analyse et Implications
L'approche d'Elevator est déterministe et produit des binaires complets et autonomes sans composant runtime dans la base de code de confiance. Le principal coût est une expansion substantielle de la taille du code. Le principal avantage est que la sortie est le code réel qui sera exécuté, permettant ainsi des tests, une validation, une certification et une signature cryptographique avant le déploiement, réduisant ainsi les risques par rapport aux émulateurs ou aux compilateurs JIT. Les performances d'Elevator sont comparables ou supérieures à celles de l'émulation JIT de QEMU.
Perspective
Les résultats de cette recherche ouvrent des perspectives intéressantes pour l'amélioration de la sécurité et de la fiabilité des systèmes logiciels. Cependant, il est important de noter que l'approche d'Elevator peut nécessiter des ressources importantes en termes de stockage et de calcul. Les prochaines étapes pourraient consister à optimiser l'approche pour la rendre plus efficace et à l'appliquer à d'autres architectures et systèmes.