hacktricks/binary-exploitation/libc-heap/large-bin-attack.md

6.9 KiB
Raw Blame History

Атака на великий бін

{% hint style="success" %} Вивчайте та практикуйте хакінг AWS: Навчання AWS Red Team Expert (ARTE) від HackTricks
Вивчайте та практикуйте хакінг GCP: Навчання GCP Red Team Expert (GRTE) від HackTricks

Підтримайте HackTricks
{% endhint %}

Основна інформація

Для отримання додаткової інформації про те, що таке великий бін, перегляньте цю сторінку:

{% 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
{% endhint %}