Псевдослучайный указатель стека под Linux? - PullRequest
6 голосов
/ 17 декабря 2009

Я играл с каким-то кодом, когда заметил что-то странное:

[~] main% cat test.cc
#include <stdio.h>

void f()
{
    int i;
    fprintf(stderr, "&i = 0x%08X\n", (long)&i);
}

int main(int argc, char**argv)
{
    f();
}
[~] main% g++ test.cc
[~] main% ./a.out
&i = 0xBFA27AB4
[~] main% ./a.out
&i = 0xBFAD7E24
[~] main% ./a.out
&i = 0xBFCA3464
[~] main% ./a.out
&i = 0xBF96C064
[~] main%

Странная вещь для меня - это изменение адреса переменной i.

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

1 Ответ

8 голосов
/ 17 декабря 2009

Рандомизация размещения адресного пространства используется именно в некоторых операционных системах именно по этой причине. Это может быть связано с изменением адресов указателей стека, что весьма вероятно в последних версиях Linux и * или BSD. Последние версии Windows IIRC также делают это.

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