Почему адреса инструкций GDB и Objdump совпадают?

Я ныряю в реверс-инжиниринг, что очень весело.

Однако у меня есть вопрос: почему адреса инструкций, которые я получаю от GDB и Objdump, совпадают?

Разве двоичный файл не должен каждый раз загружаться по разному адресу?

Спасибо. Жюльен

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

fuz 30.05.2018 01:49

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

John Bollinger 30.05.2018 02:10

Да вы оба правы на самом деле, я не думал об адресном пространстве. Спасибо за ответы, ребята.

Julien Séveno-Piltant 30.05.2018 14:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
597
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

GDB по умолчанию отключает ASLR. Если у вас set disable-randomization off, то исполняемый файл PIE (Position Indepdent) будет загружаться по случайному адресу, даже если вы run его изнутри GDB.

См. 32-битные абсолютные адреса больше не разрешены в x86-64 Linux? для получения дополнительной информации о PIE.

Исполняемые файлы Position-зависимый загружаются по тому же адресу всегда, и только их адрес стека может быть рандомизирован. Код + данные могут жестко закодировать адреса как 32-битные абсолютные, и они не содержат информации о перемещении для каждого места, где это было сделано. (например, как mov $string, %edi; call puts).

Посмотрите на gcc code-gen для Hello World с / без -fPIEв обозревателе компилятора Godbolt.

.LC0:
    .string "Hello World!"
main:
    lea     rdi, .LC0[rip]     # RIP-relative with -fPIE
    sub     rsp, 8
    call    puts@PLT
    xor     eax, eax
    add     rsp, 8
    ret

но с -fno-PIE (по умолчанию в Godbolt, часто не по умолчанию в современных дистрибутивах Linux) вы получаете mov edi, OFFSET FLAT:.LC0, 32-битный абсолютный адрес.

(Остальной код тот же, за исключением того, что он излучает call puts и позволяет компоновщику преобразовать его в call puts@PLT. Используйте -fno-plt, чтобы встроить косвенный call через адрес GOT.)

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