J'écris un petit programme qui retrace tous les appels système et syscall d'un fichier binaire (elf) en utilisant ptrace (singlestep, getregs, pick_text, comparaison d'opcodes, etc). Jusqu'à présent, j'ai réussi à tracer des appels système et des appels simples comme des fonctions définies par l'utilisateur.Printf Symbol Resolution
Mais je n'ai pas réussi à obtenir le nom du symbole printf à partir de l'adresse que je choisis grâce à ptrace.
Ma question est: Pour la fonction liée dynamique comme printf, strlen, etc, comment puis-je récupérer dans le fichier elf le nom du symbole de l'adresse?
Avec des appels simples, c'est un peu facile, je cours dans la section .strtab et quand une adresse correspond, je retourne la str correspondante.
Mais pour printf, le symbole est connu dans le fichier .strtab mais a l'adresse "0". Objdump -d réussi à lier un appel à printf avec son adresse.
Avez-vous une idée?
La liaison dynamique est-elle impliquée? – fuz
Dans la glibc, le symbole de 'printf' s'appelle en fait' __printf_chk' à cause du patch fortification. Lancez 'nm' sur un fichier objet qui appelle' printf' et vous verrez. Généralement, jetez un oeil à la libelf comme pour comment analyser les fichiers elf. Je vous recommande de ne pas les analyser manuellement. – fuz
J'utilise déjà la libelf. Et en fait, si j'utilise nm, je peux voir le symbole "printf" mais pas son adresse et le symbole est marqué avec la lettre "U" pour "Undefined". C'est mon problème, j'utilise l'adresse de la fonction pour récupérer son nom. Mais si l'adresse n'est pas stockée dans l'elfe je ne peux pas récupérer le nom. Et oui, la libc est liée dynamiquement je suppose –