Расположение функций libc меняется между разветвленными процессами?

В упражнении в стиле CTF, которое я получил, есть сервер, который использует fork () и функцию exec для запуска двоичного файла для каждого клиентского соединения. Мне удалось найти уязвимость в двоичном файле, которая позволяет мне вызывать произвольный адрес, а также утечку информации. Я думал, что использую это для утечки адреса функции libc (скажем, printf) из таблицы импорта процесса, а затем воспользуюсь этим, чтобы найти адрес системы и запустить его. Мое предположение - которое подкрепляется всем, что я читаю в Интернете - заключается в том, что ASLR только рандомизирует расположение libc в родительском процессе, и все дочерние процессы должны иметь одно и то же расположение для него. Таким образом, я смогу передать адрес в одном соединении и использовать его в другом. Однако мне кажется, что каждый раз я получаю другой адрес для printf. Работая локально, я также могу использовать GDB и подтверждать, что адрес меняется каждый раз. Так что же происходит?


person Ido Abelman    schedule 15.08.2019    source источник
comment
За исключением PID 1, все процессы являются дочерними. Так что по вашей логике мы никогда не получим ASLR.   -  person Barmar    schedule 15.08.2019
comment
@Barmar Я, кажется, все время забываю, что в основном каждый процесс Linux (кроме pid 1) создается fork (). Больше привык к окнам, где (насколько мне известно) процессы создаются с нуля. Спасибо   -  person Ido Abelman    schedule 17.08.2019


Ответы (1)


Вас достает не вилка, а исполнительный директор. Когда процесс выполняет exec, он получает полностью новое адресное пространство, теряя все загруженные динамические библиотеки, включая libc. Динамический компоновщик загружает библиотеки, которые нужны новой программе, присваивая им новые адреса. Каждый exec - это возможность снова рандомизировать адреса библиотек.

person Community    schedule 15.08.2019