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 :

Strace / ptrace


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 40
    Par défaut Strace / ptrace
    Bonjour,

    je souhaite utiliser la fonction ptrace pour faire un simple recode de strace or je me suis rapidement heurté à un problème, je pense suivre la bonne démarche pourtant je n'obtiens pas les même résultat que strace.
    Je tente pour l'instant de n'afficher que le nom des syscall du programme que je passe en paramètre ( qui ne contient q'un write(1, "TOTO\n", 5)) or je ne retombe pas du tout sur les même syscall que strace.

    output strace ./a.out :
    execve("./a.out", ["./a.out"], [/* 85 vars */]) = 0
    brk(0) = 0x602000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fda30568000
    access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
    open("/usr/lib64/mpi/gcc/openmpi/lib64/tls/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
    stat("/usr/lib64/mpi/gcc/openmpi/lib64/tls/x86_64", 0x7fffc4dd3360) = -1 ENOENT (No such file or directory)
    open("/usr/lib64/mpi/gcc/openmpi/lib64/tls/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
    stat("/usr/lib64/mpi/gcc/openmpi/lib64/tls", 0x7fffc4dd3360) = -1 ENOENT (No such file or directory)
    open("/usr/lib64/mpi/gcc/openmpi/lib64/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
    ...
    output ./my_strace ./a.out :
    execve
    execve
    chdir
    link
    mount
    fork
    write
    fork
    write
    fork
    ...
    Dans mon programme, je fork, dans le fils je trace puis j'exec mon prog passé en paramètre et dans le père grosso modo je wait sur PTRACE_SYSCALL et je boucle sur ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct user_regs_struct regs;
    ptrace(PTRACE_GETREGS, child_pid, NULL, &regs));
    printf("%s\n", SYSCALL_NAMES[regs.orig_rax]);
    Quelque chose vous choque t-il ? Ma démarche ne vous parait-elle pas bonne ?

    Je vérifie toutes mes fonctions système ainsi que mon tableau SYSCALL_NAMES qui me sert à faire la correspondance entre le numéro du syscall et son nom.

    Merci d'avance pour votre aide !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Bonsoir,

    Je n'utilise pas souvent ptrace() et je n'ai donc pas beaucoup de pratique mais, à vue de nez :

    • D'où vient ton tableau SYSCALL_NAMES[] ?
    • Tu ne testes pas la valeur de retour de ptrace(), qui peut pourtant échouer ;
    • As-tu essayé avec « rax » plutôt que « orig_rax » ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 40
    Par défaut
    Je vérifie toutes mes fonctions système ainsi que mon tableau SYSCALL_NAMES qui me sert à faire la correspondance entre le numéro du syscall et son nom.
    je vérifie bien le ptrace, pas de retour d'erreur.

    Par contre on m'a aussi dit d'utiliser le registre rax plutôt que orig_rax, mais le soucis c'est que parfois il contient des valeurs < -30 et > 50000 ... Du coup je pense que je vais tester un peu tout les registres avant toute chose, histoire de voir si c'est pas juste que je n’utilise pas le bon registre.

    Merci pour votre aide.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 11
    Par défaut
    Ça sent Epitech !

    En utilisant PTRACE_SYSCALL (qui est interdit dans le sujet en passant), le slot orig_rax contient le numéro du syscall et rax contient, lui, la valeur de retour du syscall (ce lien peut être très utile par exemple - tu noteras la capture des signaux en passant). Bref, je doute que le problème vient des registres mais plutôt de ton tableau. En effet, il faut faire attention à bien prendre les numéros pour l'architecture x86_64. Après, sans plus d'informations, on ne peut pas plus t'aider.

Discussions similaires

  1. erreur de segmentation > strace
    Par Ickou dans le forum Linux
    Réponses: 4
    Dernier message: 23/12/2006, 09h18
  2. Ptrace Comment ça marche?
    Par Ogtraba dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 03/12/2006, 19h08
  3. [Recherche] Fonction Ptrace
    Par elithrin dans le forum C++
    Réponses: 7
    Dernier message: 27/11/2006, 17h55
  4. Ptrace
    Par b4u dans le forum Linux
    Réponses: 1
    Dernier message: 15/03/2006, 21h43
  5. Recuperation des valeurs envoyé par PTRACE
    Par dragonfly dans le forum Linux
    Réponses: 8
    Dernier message: 23/01/2006, 17h21

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