libc.so mmap strace

Я завтра готовлюсь к экзамену и наткнулся на такой вопрос:

После того, как мы запустим исполняемый файл с помощью strace, мы получим следующие системные вызовы для стандартной библиотеки C lib:

  • open ("/ lib / libc.so.6", "O_RDONLY") = 3
  • mmap (NULL, 36803630, PROT_READ | PROT_EXEC, MAP_PRIVATE | MAP_DENYWRITE, 3, 0) = 0x7f312ab35000
  • mmap (0x7f312aeae000, 20480, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED | MAP_DENYWRITE, 3, 0x179000) = 0x7f312aeae000

Вопрос в том, почему первый системный вызов mmap использует PROT_READ | PROT_EXEC, а второй PROT_READ | PROT_WRITE.

Пожалуйста, подробно объясните мне, что происходит после каждого вызова mmap. Я не понимаю, зачем процессу нужно изменять libc (доступ для записи).


person Dan Lincan    schedule 25.05.2012    source источник


Ответы (1)


Карты являются частными (MAP_PRIVATE), поэтому ничего не меняет libc.so; вместо этого он изменяет частную (для процесса) копию страниц, сопоставленных с libc.so. Это будет включать сегмент данных (глобальные переменные в libc), а также глобальную таблицу смещения (GOT) и, возможно, другие структуры, участвующие в перемещении библиотеки по определенному адресу во время выполнения.

person R.. GitHub STOP HELPING ICE    schedule 25.05.2012
comment
а почему пропадает PROT_EXEC? - person Dan Lincan; 25.05.2012
comment
Данные не обязательно должны быть исполняемыми; это данные, а не код. А создание исполняемого файла с возможностью записи в память считается угрозой безопасности, поскольку это расширяет класс уязвимостей, которые могут быть повышены до выполнения произвольного кода, позволяя злоумышленнику разместить код. Многие защищенные системы даже не позволяют отображать память с разрешениями на запись и выполнение одновременно. - person R.. GitHub STOP HELPING ICE; 25.05.2012