Переполнение буфера в 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.