Bonjour,
Pour l'école nous avons du écrire un strace. La chose était assez simple et nous a permis de nous familiariser avec ptrace et le "décodage" d'opcode assembleur.
Maintenant nous devons améliorer notre strace et en faire un "ftrace" c'est à dire un programme qui trace tous les appells de fonctions (syscall, printf, strlen, fonctions écrite par l'utilisateur, etc)
J'arrive d'ors et déjà à détecter et les appels de fonctions écrite pas l'utilisateur. Je détecte l'appel de fonction grâce à l'opcode 0xE8 dans le mot retourné par ptrace(PEEK_TEXT), ensuite je cherche dans le fichier elf du programme que je trace le symbole correspondant à l'adresse calculé grâce à l'offset présent après l'opcode 0xE8.
En revanche pour les fonctions du type printf, l'addresse n'est pas référencée dans le fichier elf. D'ailleurs en faisant un nm du binaire on voit bien que le symbole printf a la lettre 'U' avec une addresse vide. La libc étant surement chargée dynamiquement cela ne m'étonne pas.
En revanche lorsque l'on fait objdump -d du binaire on voit que objdump réussit à associer l'addresse du call avec le symbole correspondant "printf@plt".
Avez-vous des indices sur comment procéder pour récupérer le nom du symbole ? A l'heure actuelle j'affiche l'addresse du call lorsque je ne peux trouver le nom du symbole associé mais cela n'est vraiment pas intuitif ni pratique pour l'utilisateur final de mon outil.
De plus, la libc étant chargée dynamiquement, pourquoi des appels à printf, strlen et compagnies sont ils référencés comme étant des "Call Near" (0xE8) au lieu d'être référencé comme des "Far Call" (0xFF) comme le sont les call de librairie dynamique habituellement... Ca n'a pas de sens ?!?
Je vous remercie et bonne soirée !
Partager