обратное инженерное сомнение - PullRequest
0 голосов
/ 23 апреля 2011
8048563:       e8 0d 00 00 00          call   8048575 <exit@plt+0x141>

Я пытался перепроектировать двоичный файл для удовольствия и увидел этот вызов в выводе objdump.Глядя на эту строку, я думал, что вызов будет к функции выхода, которая была динамически связана.Тем не менее, 8048575, кажется, является адресом в разделе .text этой программы!

  1. Почему происходит это неправильное присвоение имени функции?
  2. Место, где происходит вызовследующая строка;почему отсутствует пролог функции?
8048575:       83 ec 6c                sub    esp,0x6c

Ответы [ 4 ]

3 голосов
/ 25 апреля 2011

На самом деле это не вызов IAT / PLT, а вызов другой функции в том же файле. В файле, вероятно, удален внутренний символ, и objdump отображает все адреса в качестве последнего определенного символа перед адресом + смещение. Без внутренних символов эта функция попадет в последнюю функцию, связанную с plt, поскольку раздел plt предшествует тексту.

Таким образом, отображаемое имя является просто поддельным и может быть проигнорировано.

3 голосов
/ 23 апреля 2011

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

3 голосов
/ 23 апреля 2011

Это вызов записи IAT (таблица адресов импорта), чтобы он мог выполнять межмодульный вызов (на самом деле переход) к функции с именем 'exit`, это позволяет избежать вызовов на дальние расстояния и упрощает динамическое связывание.Что касается «пропуска» пролога, то настройка фрейма стека вообще не требуется, так как это делает его совершенно ненужным для большинства функций, поэтому выделение стека является прологом, единственными функциями, которым действительно нужен стекфреймы - это ненадежные «голые» функции сборки или те, которые вносят непредсказуемые изменения в стек.

1 голос
/ 23 апреля 2011

Выделение стекового пространства - это пролог функции, нет?Откуда ты знаешь, что это не начало функции exit?.text совершенно нормально, так как именно здесь живет код.(plt просто ссылается на «таблицу списка программ».)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...