Переполнение буфера в heap. 1 серия

kas1e

Xakep, номер #057, стр. 057-074-3


|--------------------| |--------------------|

| | | |

| | | HEAP |

| | break | |

| | address | |

| | ------> |--------------------|---->

| HEAP | | |

| | | |

| | | /\ | выделенная

| | | || | память

break | | | || |

address | | brk() | || |

------> |--------------------| ======> |- - - - -||- - - - -|---->

| | | |

| BSS (DATA SEGMENT) | | BSS (DATA SEGMENT) |

| | | |

|--------------------| |--------------------|

То есть, управляя break address "планкой", мы выделяем память из heap области. Пока вроде ничего сложного :). Запомни это, и двинемся дальше. Теперь о функциях, работающих с heap. Как я уже говорил, на самом деле, все функции, имеющие отношение к heap, работают с brk/sbrk системными вызовами, плюс некоторые другие.

Функции

Существует четыре стандартных (!) библиотечных функции, предназначенных для динамического выделения/освобождения памяти (из heap, конечно):

1. void *malloc(size_t size);

Выделяет указанное аргументом size число байтов.

2. void *calloc(size_t nelem, size_t elsize);

Выделяет память для указанного аргументом nelem числа объектов, размер которых находится в elsize. Выделенная память инициализируется нулями.

3. void *realloc(void *ptrm size_t size);

Изменяет размер предварительно выделенной области памяти (увеличивает или уменьшает, в зависимости от знака аргумента size). Увеличение размера может привести к перемещению всей области в другое место виртуальной памяти, где имеется необходимое свободное непрерывное виртуальное адресное пространство.

4. void free(void *ptr);

Освобождает память, предварительно выделенную при помощи malloc(), calloc() или realloc(). Указатель на область памяти передается через аргумент ptr.

Назад на стр. 057-074-2  Содержание  Вперед на стр. 057-074-4