Области памяти в реальной жизни

Области памяти в реальной жизни

Рассмотрим пример адресного пространства процесса и области памяти в этом адресном пространстве. Для этой цели можно воспользоваться полезной файловой системой /proc и утилитой pmар(1). В качестве примера рассмотрим следующую простую прикладную программу, которая работает в пространстве пользователя. Эта программа не делает абсолютно ничего, кроме того, что служит примером.

int main(int argc, char *argv[]) {

 return 0;

}

Рассмотрим список областей памяти из адресного пространства этого процесса. Этих областей немного. Мы уже знаем, что среди них есть сегмент кода, сегмент данных сегмент bss. Если учесть, что эта программа динамически скомпонована с библиотекой функций языка С, то соответствующие области существуют также для модуля libc.so и для модуля ld.so. И наконец, среди областей памяти также есть стек процесса.

Результат вывода списка областей адресного пространства этого процесса из файла /proc/<pid>/maps имеет следующий вид.

rml@phantasy:~$ cat /proc/1426/maps

00e80000-00faf000 r-xp 00000000 03:01 208530 /lib/tls/libc-2.3.2.so

00faf000-00fb2000 rw-p 0012f000 03:01 208530 /lib/tls/libc-2.3.2.so

00fb2000-00fb4000 rw-p 00000000 00:00 0

08048000-08049000 r-xp 00000000 03:03 439029 /home/rml/src/example

08049000-0804a000 rw-p 00000000 03:03 439029 /home/rml/src/example

40000000-40015000 r-xp 00000000 03:01 80276  /lib/ld-2.3.2.so

40015000-40016000 rw-p 00015000 03:01 80276  /lib/ld-2.3.2.so

4001e000-4001f000 rw-p 00000000 00:00 0

bfffe000-c0000000 rwxp fffff000 00:00 0

Информация об областях памяти выдается в следующем формате.

начало-конец права доступа смещение старший:младший номера устройства файловый индекс файл

Утилита pmap(1)[82] форматирует эту информацию в следующем, более удобочитаемом виде.

rml@phantasy:~$ pmap 142 6 example[142 6]

00e80000 (1212 KB) r-xp (03:01 208530) /lib/tls/libc-2.3.2.so

00faf000 (12 KB)   rw-p (03:01 208530) /lib/tls/libc-2.3.2.so 00fb2000 (8 KB) rw-p (00:00 0)

08048000 (4 KB)    r-xp (03:03 439029) /home/rml/src/example

08049000 (4 KB)    rw-p (03:03 439029) /home/rml/src/example

40000000 (84 KB)   r-xp (03:01 80276)  /lib/ld-2.3.2.so

40015000 (4 KB)    rw-p (03:01 80276)  /lib/ld-2.3.2.so

4001e000 (4 KB)    rw-p (00:00 0)

bfffe000 (8 KB)    rwxp (00:00 0)

mapped: 1340 KB writable/private: 40 KB shared: 0 KB

Первые три строчки соответствуют сегменту кода, сегменту данных и сегменту bss модуля libc.so (библиотека функций языка С). Следующие две строчки описывают соответственно сегмент кода и сегмент данных выполняемого образа. Далее три строчки — описание сегментов кода, данных и bss модуля ld.so (динамический компоновщик). Последняя строчка описывает стек процесса.

Обратите внимание, что все сегменты кода имеют права на чтение и выполнение, что и должно быть для выполняемых образов. С другой стороны, сегменты данных и bss, которые содержат глобальные переменные, помечаются как имеющие права на запись и чтение, а не на выполнение.

Все адресное пространство составляет порядка 1340 Кбайт, но только 40 Кбайт из них имеют право на запись и соответствуют частному отображению. Если область памяти является совместно используемой и не имеет прав на запись, то ядро хранит в памяти всего одну копию отображаемого файла. Это может показаться обычным для совместно используемых отображений; однако, случай, когда при этом еще и отсутствуют права на запись, проявляется несколько неожиданно. Если учесть факт, что когда на отображение нет прав записи, то соответствующая информация никогда не может быть изменена (из отображения возможно только чтение), становится ясно, что можно совершенно безопасно загрузить выполняемый образ в память всего один раз. Поэтому динамически загружаемая библиотека функций языка С и занимает в памяти всего 1212 Кбайт, а не 1212 Кбайт, умноженное на количество процессов, которые эту библиотеку используют. В связи с этим, процесс, код и данные которого имеют объем порядка 1340 Кбайт, на самом деле занимает всего 40 Кбайт физической памяти. Экономия памяти из-за такого совместного использования получается существенной.

Обратите внимание на области памяти, которые не имеют отображаемого файла, находятся на устройстве с номерами 00:00 и номер файлового индекса для которых равен нулю. Это отображение страницы, заполненной нулями (zero page, пулевая страница). Если отобразить страницу, заполненную нулями, на область памяти, которая имеет права на запись, то побочным эффектом является инициализация всех переменных в нулевые значения. Это важно, поскольку в таком случае получается область памяти, заполненная нулями, которая нужна для сегмента bss.

Каждой области памяти, связанной с процессом, соответствует структура vm_area_struct. Так как процесс не является потоком (thread), то для него существует отдельная структура min_struct, на которую есть ссылка из структуры task_struct.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Обстоятельства реальной жизни

Из книги Инфраструктуры открытых ключей автора Полянская Ольга Юрьевна

Обстоятельства реальной жизни Обстоятельства реальной жизни можно рассматривать как самое главное условие функционирования сервисов PKI. И главные, и дополнительные сервисы PKI становятся субъектом непредсказуемого поведения, некорректной работы или ненадежных


Примеры из реальной жизни

Из книги 19 смертных грехов, угрожающих безопасности программ автора Ховард Майкл

Примеры из реальной жизни Следующие примеры взяты из базы данных CVE (http://cve.mitre.org). Это лишь небольшая выборка из 188 сообщений об ошибках при работе с форматной строкой.CVE–2000–0573Цитата из бюллетеня CVE: «Функция lreply в FTP–сервере wu–ftpd версии 2.6.0 и более ранних плохо


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни Поиск по запросу «integer overflow» в базе данных уязвимостей на сайте Security Focus дает больше 50 документов, а в базе CVE – 65 документов. Вот лишь несколько из них.Ошибка в интерпретаторе Windows Script позволяет выполнить произвольный кодЦитата из бюллетеня CVE


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни Следующие примеры внедрения SQL–команд взяты из базы данных CVE (http://cve.mitre.org).CAN–2004–0348Цитата из бюллетеня CVE: «Уязвимость, связанная с внедрением SQL в сценарии viewCart.asp из программного обеспечения корзины для покупок компании SpiderSales, позволяет


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни Следующие примеры внедрения команд взяты из базы данных CVE (cve.mitre.org).CAN–2001–1187Написанный на Perl CGI–сценарий CSVForm добавляет записи в файл в формате CSV (поля, разделенные запятыми). Этот сценарий под названием statsconfig.pl поставляется в составе


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни Следующий пример взят из базы данных CVE (http://cve.mitre.org).CAN–2004–0077 do_mremap в ядре LinuxЭто, наверное, самая известная в недавней истории ошибка из разряда «забыл проверить возвращенное значение». Из–за нее были скомпрометированы многие Linux–машины,


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни Следующие примеры XSS–уязвимостей взяты из базы данных CVE (cve.mitre.org).Уязвимость IBM Lotus Domino для атаки с кросс–сайтовым сценарием и внедрением HTMLПо какой–то причине этому бюллетеню не присвоен номер в базе данных CVE. Противник может обойти


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни Изначально Интернет задумывался как научно–исследовательский проект. Среди ученых царило доверие, поэтому безопасности не уделялось много внимания. Конечно, учетные записи были защищены паролями, но этим все и ограничивалось. В результате


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни Следующие примеры взяты из базы данных CVE (http://cve.mitre.org).CAN–2000–1001Web–страница add_2_basket.asp в программе Element InstantShop позволяет противнику модифицировать информацию о цене, которая находится в скрытом поле «price».Исходный текст формы выглядит следующим


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни Любопытно, что, несмотря на чрезвычайно широкое распространение этого греха (в тот или иной момент от этой проблемы страдали по меньшей мере 90% приложений, в которых использовался SSL, но не HTTPS), во время работы над книгой в базе данных CVE


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни Есть множество примеров парольных систем, в которых обнаружены серьезные дефекты. Проблемы встречаются настолько часто, что мы уже к ним привыкли и часто склонны не обращать внимания на опасность. Поэтому многие приложения, которые, строго


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни Следующие примеры взяты из базы данных CVE (http://cve.mitre.org).CVE–2000–0100Цитата из бюллетеня CVE: «Программа SMS Remote Control устанавливается с небезопасными правами, позволяющими локальному пользователю расширить свои привилегии путем модификации или замены


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни Начнем с примеров атак с хронометражем, а затем перейдем к более традиционным способам утечки информации, о которых есть сообщения в базе данных CVE (http://cve.mitre.org).Атака с хронометражем Дэна Бернстайна на шифр АЕSДэн Бернстайн сумел провести


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни Следующие примеры взяты из базы данных CVE (http://cve.mitre.org).CAN–2005–0004Сценарий mysqlaccess, входящий во многие версии MySQL, позволяет локальному пользователю затереть произвольный файл или прочитать содержимое временных файлов путем атаки с организацией


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни Следующие примеры взяты из базы данных CVE (http://cve.mitre.org).CVE–2002–0676Цитата из бюллетеня CVE:Подсистема SoftwareUpdate для MacOS 10.1.x не проводит аутентификацию при загрузке обновлений программ. Это открывает удаленному противнику возможность выполнить


Примеры из реальной жизни

Из книги автора

Примеры из реальной жизни К сожалению, в сообщениях, касающихся безопасности, нечасто встретишь примеры, которые относились бы к проблемам практичности. Главным образом это связано с тем, что такие проблемы разработчики склонны перекладывать на пользователей. Проще во