Войти

Показать полную графическую версию : Инициализация памяти в malloc


ruslandh
08-06-2005, 01:48
malloc() выделяет size байт и возвращает указатель на
выделенную
память. Выделенная память не инициализируется.

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


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

Где-нибудь это может быть официально описано ? Что-бы "сослаться на официальный документ"
Опытным путём установил в Linux - первоначально выделяется пустая память, а дальше в ней то, что я сам положил.

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

p1=p=malloc(N)
<проверил - Тут в p* нули>
<заполняю единицами>
free(p)
p2=p=malloc(N)
(заодно проверил, что p1==p2)
<Тут в P* единицы>
free(p)

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

hasherfrog
01-08-2005, 10:32
>> первоначально выделяется пустая память

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

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

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

mar
04-08-2005, 23:55
hasherfrog
до меня тоже только сейчас дошло: действительно, если задача такая, что ее данные не стоит никому показывать, даже кусками после отработки, то надо, видимо, не просто "уничтожать" выделенную область, но предварительно чистить, заполняя все куски памяти чем-нибудь однородным.

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

Zur0
12-09-2005, 13:13
а можно вообще всю память посмотреть в /dev/mem... тока прова рута нужны %)




© OSzone.net 2001-2012