Инициализация памяти в malloc

Ответить
Аватара пользователя
ruslandh

Инициализация памяти в malloc

Сообщение ruslandh »

Цитата man malloc:



malloc() выделяет size байт и возвращает указатель на

выделенную

память. Выделенная память не инициализируется.



free() освобождает область памяти, на которую указывает pt

r, которая

быть выделена ранее посредством malloc(), calloc() или

realloc().



У меня ещё один вопрос по "программированию" образовался - функция malloc выделяет память из "кучи", можно-ли с её помощью увидеть какие-то "значения" другой задачи (из сферы безопасности и защиты от взлома).

В принципе этот вопрос важен как для Linux (ту может что-то в ядре найду, так и для Windows - тут я даже не знаю что сказать).



Где-нибудь это может быть официально описано ? Что-бы "сослаться на официальный документ"

Опытным путём установил в Linux - первоначально выделяется пустая память, а дальше в ней то, что я сам положил.



т.е. я имею ввиду цикл :



p1=p=malloc(N)





free(p)

p2=p=malloc(N)

(заодно проверил, что p1==p2)



free(p)
Аватара пользователя
Demiurg

Re: Инициализация памяти в malloc

Сообщение Demiurg »

про выделение памяти (Windows or Linux), и про то как это можно использовать в не в полне благонадежных целях была неплохая статья в Хакер'е (страниц десять)... если мне не изменяет память, в 2003 году... что-то там в названии было про HEAP...
Аватара пользователя
hasherfrog

Re: Инициализация памяти в malloc

Сообщение hasherfrog »

>> первоначально выделяется пустая память



Насколько мне известно, содержимое памяти после malloc и realloc (в "добавленной" части) вообще не предопределено. И совершенно непредсказуемо, что там будет записано. Поэтому у меня лично есть "манечка" делать memset(p,s,0) даже после calloc и new[]. Так что да, думаю что там могут (после malloc) оказаться данные чужой программы.
Аватара пользователя
mar

Re: Инициализация памяти в malloc

Сообщение mar »

вообще мне казалось так: (цитирую кусок из разговора по аське с ruslandh)

"вообще на С действительно определяется место, выделяется объем, заполняется. Дальще можно со всем этим хозяйством работать через указатели. Увидеть значения другой задачи нельзя при нормальном разделении памяти под задачи. (В старых версиях виндов, насколько я понимаю, этого не было). Кроме того, в тех же виндах (по XP включительно) для приложений уровня драйверв доступны все дескрипторные таблицы (не только своих задач ). В юниксах такого маразма (вроде бы) нет, но возможны ошибки, дающие возможность почитать память откуда не полагается.\x0d\nПро malloc лучше всего, скорей всего, в \"Ветхом завете\" Изображение - сиречь у Кернигшана и Ричи."

То есть имхо: содержимое не предопределено, предопределен (нами) размер содержимого, а за разделение памяти между задачами и процессами отвечает система.
Аватара пользователя
hasherfrog

Re: Инициализация памяти в malloc

Сообщение hasherfrog »

mar

До меня как-то не сразу дошло, получается что ruslandh в самом первом сообщении темы спрашивает, можно ли получить кусок памяти из работающего чужого приложения? Нет, конечно - сразу схлопочем memory access violation. Когда я говорил, что можно получить кусок с данными чужой программы через malloc, я имел в виду, что мы получаем мусор, уже отработанную кем-то память, помеченную в системных ресурсах как свободную для использования, но не зачищенную (ибо зачем?) при предоставлении нашей задаче. Это и только это я имел в виду. О таблицах дескрипторов речи нет. Или там о зачистке памяти из BSS-секции... :]
Аватара пользователя
mar

Re: Инициализация памяти в malloc

Сообщение mar »

hasherfrog

до меня тоже только сейчас дошло: действительно, если задача такая, что ее данные не стоит никому показывать, даже кусками после отработки, то надо, видимо, не просто "уничтожать" выделенную область, но предварительно чистить, заполняя все куски памяти чем-нибудь однородным.
Аватара пользователя
ruslandh

Re: Инициализация памяти в malloc

Сообщение ruslandh »

Интересно, то, что "погоняв" эту программульку, я, насколько мог убедился, что при первом выделении памяти через malloc - память всегда нулевая, а потом можно видеть свой "муссор" (если-бы это был кусочек вируса, то да Изображение ) , также память нулевая, если запрашивается больше определённого размера K.
Аватара пользователя
Zur0

Re: Инициализация памяти в malloc

Сообщение Zur0 »

а можно вообще всю память посмотреть в /dev/mem... тока прова рута нужны %)
Ответить

Вернуться в «Программирование в *nix»