Почему адреса инструкций от GDB и Objdump одинаковы? - PullRequest
0 голосов
/ 30 мая 2018

Я углубляюсь в реверс-инжиниринг, это действительно весело.

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

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

Спасибо.Julien

1 Ответ

0 голосов
/ 30 мая 2018

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

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

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

Посмотрите на код gcc для 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.)

...