Связь между указателем программы / инструкции (RIP) и указателем базового / фрейма (RBP) в 64-разрядном Linux

#ptrace

#ptrace

Вопрос:

мне нужна некоторая помощь по извлечению указателей команд (RIP) из стека вызовов на 64-разрядной машине Linux. я могу перемещаться по стеку с помощью ptrace и извлекать все значения фрейма / базового указателя (RBP). но поскольку мне нужны значения IP, какова арифметическая и концептуальная связь между RIP и RBP. я предполагаю, что значение RIP хранится в расположении (RBP 8) и a может прочитать его с помощью ptrace PEEKDATA. верно ли мое предположение?

Комментарии:

1. Расположение стека вызовов зависит от соглашения о вызовах и архитектуры процессора. Смотрите en.wikipedia.org/wiki/Call_stack и en.wikipedia.org/wiki/Calling_convention . Возможно, ptrace абстрагирует это, но я на самом деле не знаю.

Ответ №1:

Любой адрес возврата, введенный в стек, даст вам только %rip запуск после возврата текущей запущенной функции, а не %rip текущей выполняемой функции. Вы должны быть в состоянии получить доступ к текущему %rip тому же способу, которым это делает GDB:

  • В идеале ваша платформа должна поддерживать аргумент PTRACE_GETREGS or PTRACE_GETREGSET . Ваша страница руководства и файл заголовка должны помочь вам пройти оставшийся путь отсюда.
  • В противном случае вы сможете использовать PTRACE_PEEKUSER аргумент с соответствующим смещением для извлечения регистра из области пользователя.

Вы можете посмотреть на подробные сведения в gdb/amd64-linux-nat.c дереве исходных текстов GDB.