First Fit
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)
Коли ви звільняєте пам'ять у програмі, використовуючи glibc, різні "контейнери" використовуються для управління частинами пам'яті. Ось спрощене пояснення двох поширених сценаріїв: несортовані контейнери та швидкі контейнери.
Коли ви звільняєте частину пам'яті, яка не є швидкою частиною, вона потрапляє до несортованого контейнера. Цей контейнер діє як список, де нові звільнені частини додаються на початок (на "голову"). Коли ви запитуєте нову частину пам'яті, аллокатор дивиться на несортований контейнер ззаду (на "хвіст"), щоб знайти частину, яка достатньо велика. Якщо частина з несортованого контейнера більша, ніж вам потрібно, вона розділяється, при цьому передня частина повертається, а залишок залишається в контейнері.
Приклад:
Ви виділяєте 300 байт (a
), потім 250 байт (b
), звільняєте a
і знову запитуєте 250 байт (c
).
Коли ви звільняєте a
, вона потрапляє до несортованого контейнера.
Якщо ви потім знову запитуєте 250 байт, аллокатор знаходить a
на хвості і розділяє її, повертаючи частину, яка відповідає вашому запиту, а решту залишаючи в контейнері.
c
буде вказувати на попереднє a
і заповнене a's
.
Fastbins використовуються для малих шматків пам'яті. На відміну від неупорядкованих бінів, fastbins додають нові шматки на початок, створюючи поведінку останній прийшов - перший вийшов (LIFO). Якщо ви запитуєте малий шматок пам'яті, аллокатор витягне з голови fastbin.
Приклад:
Ви виділяєте чотири шматки по 20 байт кожен (a
, b
, c
, d
).
Коли ви звільняєте їх у будь-якому порядку, звільнені шматки додаються до голови fastbin.
Якщо ви потім запитуєте шматок на 20 байт, аллокатор поверне нещодавно звільнений шматок з голови fastbin.
ARM64. Використання після звільнення: створити об'єкт користувача, звільнити його, створити об'єкт, який отримує звільнений шматок і дозволяє записувати в нього, перезаписуючи позицію user->password з попереднього. Повторно використати користувача, щоб обійти перевірку пароля
Програма дозволяє створювати нотатки. Нотатка міститиме інформацію про нотатку в malloc(8) (з вказівником на функцію, яку можна викликати) і вказівник на інший malloc(<size>) з вмістом нотатки.
Атака полягатиме в створенні 2 нотаток (note0 і note1) з більшим вмістом malloc, ніж розмір інформації про нотатку, а потім звільнити їх, щоб вони потрапили в швидкий бін (або tcache).
Потім створити ще одну нотатку (note2) з розміром вмісту 8. Вміст буде в note1, оскільки шматок буде повторно використаний, де ми можемо змінити вказівник функції, щоб вказувати на функцію win, а потім використати Use-After-Free для note1, щоб викликати новий вказівник функції.
Можливо виділити деяку пам'ять, записати бажане значення, звільнити його, повторно виділити, і оскільки попередні дані все ще там, їх оброблять відповідно до нової очікуваної структури в шматку, що робить можливим встановлення значення для отримання прапора.
У цьому випадку потрібно записати 4 всередині конкретного шматка, який є першим, що виділяється (навіть після примусового звільнення всіх з них). У кожному новому виділеному шматку його номер в індексі масиву зберігається. Потім виділити 4 шматки (+ початково виділений), останній буде містити 4 всередині, звільнити їх і примусово повторно виділити перший, який використовуватиме останній звільнений шматок, що містить 4 всередині.