GDB: Адрес функции фиксирован или динамичен для каждой программы на другой аппаратной платформе? - PullRequest
0 голосов
/ 01 ноября 2019

Если мы напишем код C, например printf("%p\n", __builtin_return_address(0));, и предположим, что мы получим результат 0xabcd с платформы клиента . И затем мы запускаем ту же самую программу с gdb на нашей платформе и выясняем, что 0xabcd отображается на sample_function(), является ли эта же функция на платформе клиента, когда он запускает эту программу? Или, другими словами, является ли адрес стека фиксированным или динамическим для одной и той же программы, но для другой аппаратной платформы?

1 Ответ

1 голос
/ 01 ноября 2019

Для предотвращения некоторых атак, таких как переполнение буфера, операционные системы используют рандомизацию размещения адресного пространства (ASLR). ASLR гарантирует, что при каждом запуске программы адреса будут произвольно размещаться в виртуальном адресном пространстве. В Linux он включен по умолчанию. Вы можете отключить его, запустив

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

И затем, если вы хотите включить его снова, просто запустите

echo 2 | sudo tee /proc/sys/kernel/randomize_va_space

Для получения дополнительной информации вы можете проверить эту статью Насколько эффективноASLR в системах Linux?

С другой стороны, ASLR отключен в GDB по умолчанию для упрощения отладки. Вы можете включить / отключить его с помощью этих команд

set disable-randomization off
set disable-randomization on
...