6.9 KiB
Атака на великий бін
{% hint style="success" %}
Вивчайте та практикуйте хакінг AWS: Навчання AWS Red Team Expert (ARTE) від HackTricks
Вивчайте та практикуйте хакінг GCP: Навчання GCP Red Team Expert (GRTE) від HackTricks
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами на Twitter 🐦 @hacktricks_live.
- Поширюйте хакерські трюки, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Основна інформація
Для отримання додаткової інформації про те, що таке великий бін, перегляньте цю сторінку:
{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}
Можна знайти відмінний приклад у how2heap - атака на великий бін.
Основна ідея полягає в тому, що в останній "поточній" версії glibc (2.35) не перевіряється: P->bk_nextsize
, що дозволяє змінювати довільну адресу значенням великого бін-чанку, якщо виконані певні умови.
У цьому прикладі можна знайти наступні умови:
- Виділяється великий чанк
- Виділяється великий чанк, менший за перший, але в тому ж індексі
- Має бути меншим, щоб йти першим у біні
- (Створюється чанк для запобігання злиттю з верхнім чанком)
- Потім перший великий чанк звільняється, і виділяється новий чанк, більший за нього -> Чанк1 переходить до великого біну
- Потім другий великий чанк звільняється
- Тепер уразливість: Атакуючий може змінити
chunk1->bk_nextsize
на[ціль-0x20]
- Потім виділяється більший чанк, ніж chunk 2, тому chunk2 вставляється в великий бін, перезаписуючи адресу
chunk1->bk_nextsize->fd_nextsize
адресою chunk2
{% hint style="success" %}
Є інші потенційні сценарії, суть у тому, щоб додати до великого біну чанк, який є меншим за поточний X чанк у біні, тому його потрібно вставити саме перед ним у біні, і ми повинні мати можливість змінити bk_nextsize
X, оскільки саме там буде записана адреса меншого чанку.
{% endhint %}
Ось відповідний код з malloc. Додані коментарі для кращого розуміння того, як була перезаписана адреса:
{% code overflow="wrap" %}
/* 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
}
{% endcode %}
Це можна використати для перезапису глобальної змінної global_max_fast
бібліотеки libc, щоб потім використовувати атаку на швидкий бін з більшими частинами.
Ви можете знайти ще одне відмінне пояснення цієї атаки на guyinatuxedo.
Інші приклади
- La casa de papel. HackOn CTF 2024
- Атака на великий бін в тій же ситуації, як в how2heap.
- Примітив запису є складнішим, оскільки
global_max_fast
тут некорисний. - Для завершення експлойту потрібна FSOP.
{% hint style="success" %}
Вивчайте та практикуйте взлом AWS:Навчання HackTricks AWS Red Team Expert (ARTE)
Вивчайте та практикуйте взлом GCP: Навчання HackTricks GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами на Twitter 🐦 @hacktricks_live.
- Поширюйте хакерські трюки, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.