mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
164 lines
10 KiB
Markdown
164 lines
10 KiB
Markdown
# 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}}
|