Что означает, что регистр Ebp указывает на старый Ebp

Недавно я изучал сборку x86 для обратного проектирования, и в моем руководстве есть предложение, в котором говорится, что Ebp указывает на старый Ebp, однако я этого не понимаю, это сбивает с толку.

Я посмотрел на другие сообщения об этом, но никто не ответил на мой вопрос.

Когда используются указатели кадров, у функции есть пролог (если только он не голый), который выглядит как push ebp / mov ebp, esp. Вы можете видеть, что ebp перезаписывается значением esp, но до этого оно помещается в стек. Таким образом, старое значение ebp находится в стеке, но поскольку указатель стека был скопирован в ebp, это новое значение ebp указывает на старое. Один раз нарисовать это на бумаге очень поможет. Указатель фрейма полезен, потому что аргументы находятся в стеке (не все из них зависят от соглашения о вызовах) и доступ к аргументу при отправке аргументов вызова...

Margaret Bloom 05.04.2023 19:29

... сделает работу с esp утомительной. Кроме того, аргументы остаются с фиксированным смещением независимо от того, сколько места для локальных переменных выделено и сколько регистров сохранено.

Margaret Bloom 05.04.2023 19:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Смысл одного указателя кадра, ссылающегося на другой, заключается в том, что это создает связанный список кадров стека, каждый кадр стека может использоваться для идентификации предыдущего (вызывающего, вызывающего) кадра стека — это означает, что (A) отладчик может отследить вызов стек, (B) мы можем раскрутить стек для обработки исключений (catch/throw).

(Обратите внимание, что для полноты этих заданий требуются некоторые дополнительные действия/информация, а также то, что механизм указателя кадра является лишь одним из нескольких способов выполнения трассировки стека.)

Текущее ebp относится к месту, где текущий кадр сохранил предыдущее значение ebp.

Это создает классический односвязный список. Итак, разыменуйте текущий ebp и получите значение априора ebp, сделайте это с априором и получите априор ebp.

Поскольку предыдущее ebp помещается как первое нажатие вновь вызываемой функции, которая была вызвана с помощью некоторой инструкции вызова, мы знаем, что в стеке есть адрес возврата непосредственно над каждым старым значением ebp.

Поскольку адрес возврата всегда находится рядом с ebp, и мы можем проследить каждый ebp до его вызывающей стороны (фрейм вызывающей стороны), мы можем найти код, который выполнил вызов — для этого требуется использовать обратный адрес и некоторую проверку диапазонов для определения вызывающая функция. Таким образом, ключевым элементом связанного списка, созданного значениями ebp, указывающими на предыдущий кадр, является доступ к адресам возврата в кадрах стека, которые можно использовать для идентификации функции (и даже места в функции), вызвавшей вызов.

поэтому я читал комментарии и ответы и понимаю, что Ebp указывает на Ebp из предыдущего кадра стека. Я правильно понимаю?

fre 05.04.2023 22:19

Да, классический односвязный список. @fre ebp указывает на место в текущем кадре, где хранится предыдущий ebp, поэтому разыменуйте ebp и получите значение Prior ebp, сделайте это с Prior и получите априор ebp. Непосредственно над каждым сохраненным/предыдущим ebp находится адрес возврата, поэтому вы можете найти код, который выполнил вызов — обычно это требует некоторой проверки диапазонов для идентификации вызывающей функции.

Erik Eidt 05.04.2023 22:21

я не знаю, как я могу принять комментарий как ваш ответ, вы можете написать его как ответ, и я отмечу его?

fre 05.04.2023 23:15

@fre, хорошо, надеюсь, что редактирование поможет.

Erik Eidt 05.04.2023 23:45

Другие вопросы по теме