Функция «основного» адреса остается неизменной. Почему адрес локальной переменной меняется каждый раз? - PullRequest
0 голосов
/ 11 января 2019

Пожалуйста, обратитесь к программе ниже:

#include<stdio.h>
int main()
{
        int a, b;
        printf("address of main =%p\n", main);
        a=3;
        printf("Address of 'a' =%p\n", &a);
        return 0;
}

Я скомпилировал вышеуказанную программу, используя gcc, а затем запустил двоичный файл. Я получаю следующий вывод:

[root@localhost gdb]# ./a.out
address of main =0x400536
Address of 'a' =0x7ffc4802cbdc
[root@localhost gdb]# ./a.out
address of main =0x400536
Address of 'a' =0x7ffe2bdcd66c
[root@localhost gdb]#

Тот же исходный код скомпилирован с –m32, теперь я получаю вывод:

[root@localhost gdb]# ./a.out
address of main =0x804841b
Address of 'a' =0xffa6b29c
[root@localhost gdb]# ./a.out
address of main =0x804841b
Address of 'a' =0xff9b808c

Вот мой вопрос: почему изменился адрес диапазона переменных a при запуске 64- и 32-битного приложения в 64-битном ядре? Адрес функции main остается неизменным. Почему адреса переменных a меняются при каждом запуске? И где хранится адрес переменной a?

1 Ответ

0 голосов
/ 11 января 2019

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

Программа знает, где a, потому что его смещение в кадре стека main встроено в него компилятором, а адрес кадра стека для main исходит из указателя стека, переданного в main программным обеспечением, которое загружает программу и запускает main.

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