164 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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}}