IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Résolution des symboles dynamiques avec Ptrace


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Par défaut Résolution des symboles dynamiques avec Ptrace
    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 !

  2. #2
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Par défaut
    Bonsoir,

    Pour ceux que cela intéresse, nous avons trouvé une solution avec mon collègue étudiant. C'est une solution qui nous semble "crade" mais qui fonctionne.

    Au chargement on ouvre le fichier /proc/pid/maps du programme que nous sommes en train de tracer.

    Nous parsons le fichier pour récupérer tous les *.so sous forme de string.

    Une fois que l'on a connaissance de toutes les libraries dynamiques impliquées dans l'execution de ce programme, lorsqu'on recherche un symbole on le recherche dans la table des symbole du binaire tracé mais aussi dans les tables des symboles des librairies dynamiques trouvées.


    Si quelqu'un a mieux, vous êtes le bienvenue, nous avons un peu "honte" de notre solution

    exit(EXIT_SUCCESS);

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    les appels aux fonctions ne sont pas des appels directs dans le sens où comme tu dis ils tapent dans des lib chargées dynamiquement, du coup la résolution des symboles est faite de manière dynamique également par l'intermédiaire de la GOT (Global Offset Table) et de la PLT (Procedure Linkage Table)

    tout ça remonte un petit peu pour moi déjà et je manque de la motiv nécéssaire pour me replonger là dedans et te décortiquer tout le mécanisme, c'est laissé en exercice dirons-nous mais en gros le fait que tu trouves une table "vide" et des call "near" est normal puisque la PLT est pas très loin et que la GOT se remplit au runtime, lorsque le programme a besoin de la fonction (en clair tant qu'on a pas besoin de printf, l'entrée dans la GOT reste vide, l'entrée dans la PLT elle par contre est dispo et fixe)

    une façon de vous en sortir pourrait être de caler un putenv("LD_BIND_NOW=1"); avant d'exec le binaire à ptracer, ce qui force l'édition de liens dès le début du programme et ensuite d'aller lire les entrées dans la GOT simplement

    de la doc plus ou moins bien sentie :

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/04/2013, 09h47
  2. [Débutant] Ajouter des boutton dynamiquement Avec sauvegarde.
    Par sakhana88 dans le forum C#
    Réponses: 2
    Dernier message: 07/02/2013, 11h13
  3. Gestion des sprites dynamiques avec liste chaînée
    Par Mokona dans le forum Contribuez
    Réponses: 0
    Dernier message: 21/12/2010, 14h55
  4. Utilisation des formulaires dynamiques avec struts
    Par nabdelghafour dans le forum Struts 1
    Réponses: 1
    Dernier message: 30/03/2007, 11h58
  5. Réponses: 2
    Dernier message: 17/11/2006, 07h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo