Large Bin Attack

Підтримайте HackTricks

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

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

Bins & Memory Allocations

Можна знайти відмінний приклад у how2heap - атака на великий бін.

Основна ідея полягає в тому, що в останній "поточній" версії glibc (2.35) не перевіряється: P->bk_nextsize, що дозволяє змінювати довільну адресу значенням великого бін-чанку, якщо виконані певні умови.

У цьому прикладі можна знайти наступні умови:

  • Виділяється великий чанк

  • Виділяється великий чанк, менший за перший, але в тому ж індексі

  • Має бути меншим, щоб йти першим у біні

  • (Створюється чанк для запобігання злиттю з верхнім чанком)

  • Потім перший великий чанк звільняється, і виділяється новий чанк, більший за нього -> Чанк1 переходить до великого біну

  • Потім другий великий чанк звільняється

  • Тепер уразливість: Атакуючий може змінити chunk1->bk_nextsize на [ціль-0x20]

  • Потім виділяється більший чанк, ніж chunk 2, тому chunk2 вставляється в великий бін, перезаписуючи адресу chunk1->bk_nextsize->fd_nextsize адресою chunk2

Є інші потенційні сценарії, суть у тому, щоб додати до великого біну чанк, який є меншим за поточний 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.

Інші приклади

  • Атака на великий бін в тій же ситуації, як в how2heap.

  • Примітив запису є складнішим, оскільки global_max_fast тут некорисний.

  • Для завершення експлойту потрібна FSOP.

Підтримайте HackTricks

Last updated