free
Last updated
Last updated
Вивчайте та практикуйте хакінг AWS: Навчання HackTricks AWS Red Team Expert (ARTE) Вивчайте та практикуйте хакінг GCP: Навчання HackTricks GCP Red Team Expert (GRTE)
(У цьому зведеному описі не пояснюються перевірки, а деякі випадки були опущені для кратності)
Якщо адреса є нульовою, нічого не робити
Якщо частина була відображена, відображіть її та завершіть
Виклик _int_free
:
Якщо можливо, додайте частину до tcache
Якщо можливо, додайте частину до швидкого біна
Викличте _int_free_merge_chunk
, щоб сконсолідувати частину, якщо це потрібно, та додайте її до неупорядкованого списку
Free
викликає __libc_free
.
Якщо передана адреса є Null (0), нічого не робити.
Перевірте тег вказівника
Якщо частина є mmaped
, викличте mummap
і все
Якщо ні, додайте колір та викличте _int_free
над ним
Спочатку він спробує виділити цей фрагмент у відповідному tcache. Однак перед цим виконуються деякі перевірки. Він буде перебирати всі фрагменти 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
Якщо все пройде успішно, фрагмент додається до tcache, і функція повертається.
Ця функція спробує об'єднати частину P розміром SIZE байтів з його сусідами. Помістіть отриману частину в список несортованих блоків.
Виконуються деякі перевірки:
Якщо частина є верхньою частиною: подвійне вивільнення або пошкодження (верх)
Якщо наступна частина знаходиться за межами арени: подвійне вивільнення або пошкодження (зовні)
Якщо частина не позначена як використана (в prev_inuse
наступної частини): подвійне вивільнення або пошкодження (!prev)
Якщо наступна частина має занадто малий або занадто великий розмір: free(): недійсний наступний розмір (звичайний)
якщо попередня частина не використовується, вона спробує сконсолідувати. Але, якщо prev_size відрізняється від розміру, вказаного в попередній частині: пошкоджений розмір проти prev_size під час консолідації