2010-07-07 36 views
2

i besoin d'aide sur la récupération des pointeurs d'instruction (RIP) d'une pile d'appel sur Linux 64 bits machine. Je peux traverser la pile en utilisant ptrace et récupérer toutes les valeurs du pointeur Frame/Base (RBP). mais comme je veux des valeurs IP, quelle est la relation arithmétique et conceptuelle entre RIP et RBP. Je suppose que la valeur RIP est stockée à l'emplacement (RBP + 8) et peut le lire en utilisant ptrace PEEKDATA. mon hypothèse est-elle correcte?Relation entre le programme/pointeur d'instruction (RIP) et Base/pointeur de cadre (RBP) sur 64 bits Linux

+0

La disposition de la pile d'appels dépend de la convention d'appel et de l'architecture du processeur. Voir http://en.wikipedia.org/wiki/Call_stack et http://en.wikipedia.org/wiki/Calling_convention. Peut-être que ptrace résume cela, mais je ne le sais pas vraiment. –

Répondre

2

Toute adresse de retour insérée dans la pile ne vous obtiendra que le %rip commençant après le retour de la fonction en cours d'exécution, et non le %rip de la fonction en cours d'exécution. Vous devriez être en mesure d'obtenir vos mains sur le %rip courant de la même façon GDB fait:

  • Idéalement, votre plate-forme prend en charge l'argument PTRACE_GETREGS ou PTRACE_GETREGSET. Votre page de manuel et le fichier d'en-tête devraient vous permettre de passer le reste de la partie.
  • A défaut, vous devriez pouvoir utiliser l'argument PTRACE_PEEKUSER avec le décalage approprié pour récupérer le registre de la zone utilisateur.

Vous pouvez consulter les détails du gorey dans gdb/amd64-linux-nat.c dans l'arborescence des sources GDB.