2016-07-03 2 views
0

Я пытаюсь вычислить смещение от начала стека до текущего указателя стека.Как получить основную базу стека из/proc/[pid]/maps?

Когда я прочитал/Proc/[PID]/карты Я вижу

befdf000-bf000000 rwxp 00000000 00:00 0   [stack] 

0xbefdf000 выглядит как старт стека адрес. Проблема в том, что когда я смотрю на регистр SP в gdb, фактический указатель стека - это что-то вроде 0xbefff440.

Стек растет с высоких адресов до более низких, но 0xbefff440 составляет> 0xbefdf000, как возможно, что фактический указатель стека выше, чем самый высокий адрес стека из/proc/*/maps?

В соответствии с функцией проверки памяти gdb функция высочайшего считываемого адреса стека равна 0xbeffffff, и это похоже на начало реального стека, но что такое befdf000 в файлах proc? Если это не реальная база стека, то как получить 0xbeffffff (который может быть изменен с помощью ASLR) из/proc /?

Я запускаю тесты на ARM Debian в qemu. Я отключил ASLR, поэтому адрес стека не изменяется между разными прогонами программы.

ответ

1

Я не понимаю, что вы просите. Предположительно, ваша математика просто ошибается. 0xbefff440 находится в диапазоне от 0xbefdf000 до 0xbeffffff, примерно в верхней части диапазона, как и ожидалось.

+0

Но нет диапазона befdf000-bf000000 согласно/proc/*/maps? 0xbefff440 не находится в диапазоне befdf000-bf000000, и это меня смущает – user554738

+0

Ум, да. 0xbf000000 - это адрес сразу после 0xbeffffff, а 0xbefff440 - немного ниже. Диапазоны выражаются в виде полуоткрытых интервалов, поэтому «0xbefdf000-0xbeffffff» означает все адреса x с «0xbefdf000 <= x <0xbeffffff», но поскольку данный адрес не соответствует границе, которая в любом случае не имеет значения. –

+0

О, спасибо. Я был невнимателен и думал, что первый адрес выше, я не заметил, что второй адрес b ** F ** 000000 Я думал, что это b ** E ** 000000 – user554738

0

Два адреса - это две границы, в которых может быть стек. Если попытка выполнить операции стека сделает его выше одного предела (в нашем случае нижний или начальный адрес) ОС будет пытаться увеличить сегмент стека, опустив нижний край, чтобы освободить место для новых записей стека, или может отправить SEGV в случае, если он не сможет расширить стек (например, если он будет перекрываться с разворотом AKA программной разлома)

Первое нажатие записывает последние байты сегмента.

Смежные вопросы