Почему значение указателя стека всегда одинаково, когда ASLR выключен?

Хотя в системе работает много функций, как может значение указателя стека (ESP) быть одинаковым каждый раз для каждой функции, работающей в стеке (потому что каждая функция имеет разный адрес)???? Особенно когда ASLR выключен????


person user3460964    schedule 17.08.2014    source источник
comment
Я сомневаюсь, что указатель стека одинаков каждый раз для каждой функции.   -  person Oliver Charlesworth    schedule 17.08.2014
comment
"одинаковые" в чем? Это не то же самое, когда функция вызывается из стеков вызовов разной глубины.   -  person Pascal Cuoq    schedule 17.08.2014


Ответы (2)


Значение указателя стека не одинаково для каждой функции и не зависит от настроек ASLR. Указатель стека устанавливается в каком-либо месте при создании потока выполнения, и функции увеличивают или уменьшают его для хранения данных по мере выполнения программы. В частности, код функции обычно не хранится в стеке; указатели на код функции есть.

Без ASLR, как только вы обнаружите ошибку переполнения буфера стека, вы можете вставить «блок кода», который вызывает другие функции в эксплуатируемом приложении, потому что вы знаете, где находятся такие функции. С ASLR вы не можете легко сделать это, потому что вы не знаете, где живет этот код.

person Billy ONeal    schedule 17.08.2014
comment
Предположим, мы отключили ASLR. Затем, когда мы распечатываем esp, он каждый раз показывает одно и то же значение. Так как же может быть, чтобы esp всегда указывал на один и тот же адрес. Многие функции работают в системе каждый раз. - person user3460964; 19.08.2014
comment
@user: ASLR не перемещает стек. ASLR перемещает код. Стек не содержит кода; он содержит только указатели на код. Если бы вы печатали значения адресов возврата в стеке, вы бы ожидали, что они будут разными, но сам стек известен. Применение ASLR к стеку не дает никаких преимуществ — шелл-код может получить его местоположение в любое время, просто запросив ESP :) - person Billy ONeal; 19.08.2014

Включение ASLR на самом деле может повлиять на базовый адрес стека для каждого отдельного потока. Вот цитата из Windows Internals, Sixth Edition, Part 2, pp.249-250:

Следующим шагом в ASLR является рандомизация расположения стека начального потока (и, впоследствии, каждого нового потока). Эта рандомизация включена, если только для процесса не был включен флаг StackRandomizationDisabled, и состоит из первого выбора одного из 32 возможных местоположений стека, разделенных либо 64 КБ, либо 256 КБ. Этот базовый адрес выбирается путем нахождения первой подходящей свободной области памяти, а затем выбора x-й доступной области, где x снова генерируется на основе TSC текущего процессора, сдвинутого и замаскированного в 5-битное значение (что позволяет использовать 32 возможных местоположения) .

Как только этот базовый адрес выбран, вычисляется новое значение, полученное из TSC, длиной 9 бит. Затем значение умножается на 4 для сохранения выравнивания, что означает, что оно может достигать 2048 байт (половина страницы). Он добавляется к базовому адресу для получения конечной базы стека.

Упомянутый выше флаг (StackRandomizationDisabled) находится в структуре пространства ядра EPROCESS и не может быть явно установлен из пользовательского пространства. Однако если отключить ASLR, то базовый адрес стека для основного потока в приложении будет одинаковым при разных повторных запусках. На практике это означает, что если вы находитесь внутри одной и той же функции в одной и той же строке каждый раз, когда запускаете приложение, то ESP/RSP будут одинаковыми.

Несколько примеров, демонстрирующих эту концепцию.

Обратите внимание, что каждый процесс в операционной системе имеет собственное виртуальное адресное пространство, но это не то же самое, что физическое адресное пространство. Таким образом, если вы запустите два экземпляра вашего приложения одновременно (ASLR отключен) и сделаете шаг в одном и том же месте, вы увидите одинаковые значения ESP/RSP. Каждое значение принадлежит виртуальному адресному пространству своего собственного процесса и не связано с другими процессами. Вы можете обратиться, например, к этой ссылке для получения дополнительной информации о структуре памяти.

person greenpiece    schedule 05.04.2016