# Heap Functions Security Checks {{#include ../../../banners/hacktricks-training.md}} ## unlink Для отримання додаткової інформації перегляньте: {{#ref}} unlink.md {{#endref}} Це резюме виконаних перевірок: - Перевірте, чи вказаний розмір частини такий же, як `prev_size`, вказаний у наступній частині - Повідомлення про помилку: `corrupted size vs. prev_size` - Також перевірте, що `P->fd->bk == P` і `P->bk->fw == P` - Повідомлення про помилку: `corrupted double-linked list` - Якщо частина не мала, перевірте, що `P->fd_nextsize->bk_nextsize == P` і `P->bk_nextsize->fd_nextsize == P` - Повідомлення про помилку: `corrupted double-linked list (not small)` ## \_int_malloc Для отримання додаткової інформації перегляньте: {{#ref}} malloc-and-sysmalloc.md {{#endref}} - **Перевірки під час пошуку швидкого бін:** - Якщо частина неправильно вирівняна: - Повідомлення про помилку: `malloc(): unaligned fastbin chunk detected 2` - Якщо наступна частина неправильно вирівняна: - Повідомлення про помилку: `malloc(): unaligned fastbin chunk detected` - Якщо повернена частина має неправильний розмір через свій індекс у швидкому біні: - Повідомлення про помилку: `malloc(): memory corruption (fast)` - Якщо будь-яка частина, що використовується для заповнення tcache, неправильно вирівняна: - Повідомлення про помилку: `malloc(): unaligned fastbin chunk detected 3` - **Перевірки під час пошуку малого біна:** - Якщо `victim->bk->fd != victim`: - Повідомлення про помилку: `malloc(): smallbin double linked list corrupted` - **Перевірки під час консолідації**, виконувані для кожної частини швидкого біна: - Якщо частина неправильно вирівняна, викликайте: - Повідомлення про помилку: `malloc_consolidate(): unaligned fastbin chunk detected` - Якщо частина має інший розмір, ніж той, який вона повинна мати через індекс, в якому вона знаходиться: - Повідомлення про помилку: `malloc_consolidate(): invalid chunk size` - Якщо попередня частина не використовується, а попередня частина має розмір, відмінний від вказаного prev_chunk: - Повідомлення про помилку: `corrupted size vs. prev_size in fastbins` - **Перевірки під час пошуку неупорядкованого біна:** - Якщо розмір частини дивний (занадто малий або занадто великий): - Повідомлення про помилку: `malloc(): invalid size (unsorted)` - Якщо розмір наступної частини дивний (занадто малий або занадто великий): - Повідомлення про помилку: `malloc(): invalid next size (unsorted)` - Якщо попередній розмір, вказаний наступною частиною, відрізняється від розміру частини: - Повідомлення про помилку: `malloc(): mismatching next->prev_size (unsorted)` - Якщо не `victim->bck->fd == victim` або не `victim->fd == av (arena)`: - Повідомлення про помилку: `malloc(): unsorted double linked list corrupted` - Оскільки ми завжди перевіряємо останню, її fd завжди повинно вказувати на структуру арени. - Якщо наступна частина не вказує, що попередня використовується: - Повідомлення про помилку: `malloc(): invalid next->prev_inuse (unsorted)` - Якщо `fwd->bk_nextsize->fd_nextsize != fwd`: - Повідомлення про помилку: `malloc(): largebin double linked list corrupted (nextsize)` - Якщо `fwd->bk->fd != fwd`: - Повідомлення про помилку: `malloc(): largebin double linked list corrupted (bk)` - **Перевірки під час пошуку великого біна (за індексом):** - `bck->fd-> bk != bck`: - Повідомлення про помилку: `malloc(): corrupted unsorted chunks` - **Перевірки під час пошуку великого біна (наступний більший):** - `bck->fd-> bk != bck`: - Повідомлення про помилку: `malloc(): corrupted unsorted chunks2` - **Перевірки під час використання Top chunk:** - `chunksize(av->top) > av->system_mem`: - Повідомлення про помилку: `malloc(): corrupted top size` ## `tcache_get_n` - **Перевірки в `tcache_get_n`:** - Якщо частина неправильно вирівняна: - Повідомлення про помилку: `malloc(): unaligned tcache chunk detected` ## `tcache_thread_shutdown` - **Перевірки в `tcache_thread_shutdown`:** - Якщо частина неправильно вирівняна: - Повідомлення про помилку: `tcache_thread_shutdown(): unaligned tcache chunk detected` ## `__libc_realloc` - **Перевірки в `__libc_realloc`:** - Якщо старий вказівник неправильно вирівняний або розмір був неправильним: - Повідомлення про помилку: `realloc(): invalid pointer` ## `_int_free` Для отримання додаткової інформації перегляньте: {{#ref}} free.md {{#endref}} - **Перевірки на початку `_int_free`:** - Вказівник вирівняний: - Повідомлення про помилку: `free(): invalid pointer` - Розмір більший за `MINSIZE` і розмір також вирівняний: - Повідомлення про помилку: `free(): invalid size` - **Перевірки в `_int_free` tcache:** - Якщо є більше записів, ніж `mp_.tcache_count`: - Повідомлення про помилку: `free(): too many chunks detected in tcache` - Якщо запис не вирівняний: - Повідомлення про помилку: `free(): unaligned chunk detected in tcache 2` - Якщо звільнена частина вже була звільнена і присутня як частина в tcache: - Повідомлення про помилку: `free(): double free detected in tcache 2` - **Перевірки в `_int_free` швидкому біні:** - Якщо розмір частини недійсний (занадто великий або малий), викликайте: - Повідомлення про помилку: `free(): invalid next size (fast)` - Якщо додана частина вже була верхньою частиною швидкого біна: - Повідомлення про помилку: `double free or corruption (fasttop)` - Якщо розмір частини на верху має інший розмір, ніж частина, яку ми додаємо: - Повідомлення про помилку: `invalid fastbin entry (free)` ## **`_int_free_merge_chunk`** - **Перевірки в `_int_free_merge_chunk`:** - Якщо частина є верхньою частиною: - Повідомлення про помилку: `double free or corruption (top)` - Якщо наступна частина знаходиться за межами кордонів арени: - Повідомлення про помилку: `double free or corruption (out)` - Якщо частина не позначена як використана (в prev_inuse наступної частини): - Повідомлення про помилку: `double free or corruption (!prev)` - Якщо наступна частина має занадто малий або занадто великий розмір: - Повідомлення про помилку: `free(): invalid next size (normal)` - Якщо попередня частина не використовується, вона спробує консолідувати. Але, якщо `prev_size` відрізняється від розміру, вказаного в попередній частині: - Повідомлення про помилку: `corrupted size vs. prev_size while consolidating` ## **`_int_free_create_chunk`** - **Перевірки в `_int_free_create_chunk`:** - Додаючи частину в неупорядкований бін, перевірте, чи `unsorted_chunks(av)->fd->bk == unsorted_chunks(av)`: - Повідомлення про помилку: `free(): corrupted unsorted chunks` ## `do_check_malloc_state` - **Перевірки в `do_check_malloc_state`:** - Якщо неправильно вирівняна частина швидкого біна: - Повідомлення про помилку: `do_check_malloc_state(): unaligned fastbin chunk detected` ## `malloc_consolidate` - **Перевірки в `malloc_consolidate`:** - Якщо неправильно вирівняна частина швидкого біна: - Повідомлення про помилку: `malloc_consolidate(): unaligned fastbin chunk detected` - Якщо неправильний розмір частини швидкого біна: - Повідомлення про помилку: `malloc_consolidate(): invalid chunk size` ## `_int_realloc` - **Перевірки в `_int_realloc`:** - Розмір занадто великий або занадто малий: - Повідомлення про помилку: `realloc(): invalid old size` - Розмір наступної частини занадто великий або занадто малий: - Повідомлення про помилку: `realloc(): invalid next size` {{#include ../../../banners/hacktricks-training.md}}