Large Bin Attack
Reading time: 3 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Basic Information
Для отримання додаткової інформації про те, що таке великий бін, перегляньте цю сторінку:
Можна знайти чудовий приклад у how2heap - large bin attack.
В основному, тут ви можете побачити, як у останній "поточній" версії glibc (2.35) не перевіряється: P->bk_nextsize
, що дозволяє змінювати довільну адресу значенням великого бін-чанка, якщо виконуються певні умови.
У цьому прикладі ви можете знайти такі умови:
- Виділено великий чанк
- Виділено великий чанк, менший за перший, але в тому ж індексі
- Повинен бути меншим, тому в біні він повинен йти першим
- (Створюється чанк, щоб запобігти злиттю з верхнім чанком)
- Потім перший великий чанк звільняється, і виділяється новий чанк, більший за нього -> Chunk1 потрапляє до великого біна
- Потім другий великий чанк звільняється
- Тепер вразливість: Зловмисник може змінити
chunk1->bk_nextsize
на[target-0x20]
- Потім виділяється більший чанк, ніж чанк 2, тому chunk2 вставляється у великий бін, перезаписуючи адресу
chunk1->bk_nextsize->fd_nextsize
адресою chunk2
tip
Є й інші потенційні сценарії, суть полягає в тому, щоб додати до великого біна чанк, який є меншим за поточний X чанк у біні, тому його потрібно вставити безпосередньо перед ним у біні, і ми повинні мати можливість змінити bk_nextsize
X, оскільки саме туди буде записана адреса меншого чанка.
Це відповідний код з malloc. Коментарі були додані, щоб краще зрозуміти, як адреса була перезаписана:
/* if smaller than smallest, bypass loop below */
assert (chunk_main_arena (bck->bk));
if ((unsigned long) (size) < (unsigned long) chunksize_nomask (bck->bk))
{
fwd = bck; // fwd = p1
bck = bck->bk; // bck = p1->bk
victim->fd_nextsize = fwd->fd; // p2->fd_nextsize = p1->fd (Note that p1->fd is p1 as it's the only chunk)
victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_nextsize
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
}
Це може бути використано для перезапису глобальної змінної global_max_fast
libc, щоб потім експлуатувати атаку на швидкі контейнери з більшими частинами.
Ви можете знайти ще одне чудове пояснення цієї атаки в guyinatuxedo.
Інші приклади
- La casa de papel. HackOn CTF 2024
- Атака на великий контейнер у тій же ситуації, як це з'являється в how2heap.
- Примітив запису є більш складним, оскільки
global_max_fast
тут марний. - FSOP потрібен для завершення експлуатації.
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.