Double Free
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Якщо ви звільняєте блок пам'яті більше ніж один раз, це може порушити дані аллокатора і відкрити двері для атак. Ось як це відбувається: коли ви звільняєте блок пам'яті, він повертається до списку вільних частин (наприклад, "швидкий бін"). Якщо ви звільняєте той самий блок двічі підряд, аллокатор виявляє це і видає помилку. Але якщо ви звільняєте іншу частину між цим, перевірка на подвійне звільнення обходиться, що призводить до пошкодження.
Тепер, коли ви запитуєте нову пам'ять (використовуючи malloc
), аллокатор може надати вам блок, який був звільнений двічі. Це може призвести до того, що два різні вказівники вказують на одне й те саме місце в пам'яті. Якщо зловмисник контролює один з цих вказівників, він може змінити вміст цієї пам'яті, що може викликати проблеми з безпекою або навіть дозволити йому виконати код.
Example:
У цьому прикладі, після заповнення tcache кількома звільненими частинами (7), код звільняє частину h
, потім частину i
, а потім знову h
, що викликає подвійне звільнення (також відоме як Fast Bin dup). Це відкриває можливість отримання перекриваючих адрес пам'яті під час повторного виділення, що означає, що два або більше вказівників можуть вказувати на одне й те саме місце в пам'яті. Маніпулювання даними через один вказівник може вплинути на інший, створюючи критичний ризик безпеки та потенціал для експлуатації.
Виконуючи це, зверніть увагу, як i1
і i2
отримали одну й ту ж адресу:
Ми можемо виділяти лише частини розміру Fast-Bin, за винятком розміру 0x70
, що запобігає звичайному переписуванню __malloc_hook
.
Натомість ми використовуємо адреси PIE, які починаються з 0x56
, як ціль для Fast Bin dup (1/2 шанс).
Одне з місць, де зберігаються адреси PIE, знаходиться в main_arena
, який є частиною Glibc і знаходиться поруч з __malloc_hook
.
Ми націлюємося на конкретний зсув main_arena
, щоб виділити частину там і продовжувати виділяти частини, поки не досягнемо __malloc_hook
, щоб отримати виконання коду.
Використовуючи Tcache bins і переповнення нульовим байтом, ми можемо досягти ситуації з подвійним звільненням:
Ми виділяємо три частини розміру 0x110
(A
, B
, C
)
Ми звільняємо B
Ми звільняємо A
і виділяємо знову, щоб використати переповнення нульовим байтом
Тепер поле розміру B
становить 0x100
, замість 0x111
, тому ми можемо звільнити його знову
У нас є один Tcache-bin розміру 0x110
і один розміру 0x100
, які вказують на одну й ту ж адресу. Отже, у нас є подвійне звільнення.
Ми використовуємо подвійне звільнення, використовуючи Tcache poisoning
Вчіться та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вчіться та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)