#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
orPTRACE_GETREGSET
. Ваша страница руководства и файл заголовка должны помочь вам пройти оставшийся путь отсюда. - В противном случае вы сможете использовать
PTRACE_PEEKUSER
аргумент с соответствующим смещением для извлечения регистра из области пользователя.
Вы можете посмотреть на подробные сведения в gdb/amd64-linux-nat.c
дереве исходных текстов GDB.