Pourquoi le «strip» ne supprime-t-il pas les en-têtes de section des exécutables ELF?

9

Un exécutable ELF minimal nécessite uniquement l'en-tête ELF et au moins un en-tête de programme pour être fonctionnel. Cependant, lorsque j'exécute strip sur un exécutable court, il décide de ne pas jeter la table d'en-tête de section ou la section des chaînes de section, en les conservant bien qu'elles n'aient aucun but (pour autant que je sache) pour l'exécution du programme.

Y a-t-il une raison pour laquelle ceux-ci ne sont pas supprimés par bande? Existe-t-il un autre utilitaire qui supprime tout ce qui n'est pas requis pour que l'exécutable s'exécute? J'ai essayé de modifier manuellement l'exécutable de golf de code que je faisais pour supprimer les en-têtes de section, et il semble fonctionner correctement et être beaucoup plus petit.

Mystor
la source
Il n'est pas supprimé probablement car il peut casser certains programmes / runtimes
cat

Réponses:

3

La documentation de GNU binutilsstrip fait allusion à la raison, mais n'est pas explicite, mentionnant dans la description de --only-keep-debugcette

Remarque - les en-têtes de section des sections supprimées sont conservés, y compris leurs tailles, mais le contenu de la section est supprimé. Les en-têtes de section sont conservés afin que d'autres outils puissent faire correspondre le fichier debuginfo avec le véritable exécutable, même si cet exécutable a été déplacé vers un autre espace d'adressage.

Autrement dit, sauf indication contraire explicite via l' -Roption, stripconservera les en-têtes de section pour aider d'autres programmes (y compris gdb) à faire leur travail.

La page Utilisation correcte de la commande strip (partie de la rétro-ingénierie utilisant le système d'exploitation Linux ) notes

L'exécution de la stripcommande sur un exécutable est la méthode de protection de programme la plus courante. Dans son opération par défaut, la stripcommande supprime la table des symboles et toutes les informations de débogage d'un exécutable. C'est ainsi qu'il est généralement utilisé. Cependant, il existe toujours des informations utiles qui ne sont pas supprimées.

et continue en énumérant plusieurs choses utiles qui pourraient être laissées pour compte - pour l'analyse d'un exécutable "dépouillé".

Dans Learning Linux Binary Analysis , cela est réitéré, commentant que les en-têtes de section ne sont normalement manquants que lorsque quelqu'un les a délibérément supprimés, et cela sans en-têtes de section, gdbet objdumpsont presque inutiles.

Thomas Dickey
la source