• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Heap Exploitation, House of Spirit (часть 4.4)

timeshout

RAID-массив
Пользователь
Регистрация
29.06.2022
Сообщения
62
Реакции
83
Введение в эксплуатацию двоичных файлов x64 Linux (часть 1)
Введение в бинарную эксплуатацию x64 Linux (часть 2)
Heap exploitation, Overflows (часть 3)
Heap exploitation, Use After Free & Double free (Часть 4)
Heap Exploitation, FastBin Dup to Stack (часть 4.1)
Heap Exploitation, FastBin Dup Consolidate (часть 4.2)
Heap Exploitation, FastBin Dup Consolidate (часть 4.3)

House of Spirit
Конкретная атака была первоначально представлена 11 октября 2005 года в списке рассылки bugtraq автором Phantasmal Phantasmagoria под названием The Malloc Maleficarum. Идея очень проста и стала еще проще с появлением локального кэша потоков (tcache).

Проще говоря, предположим, что у вас есть указатель на чанк, который вы можете перезаписать, чтобы он указывал на произвольный адрес, содержимое которого вы контролируете. Тогда можно "обмануть" аллокатор, чтобы он использовал ваш адрес как указатель на свободный чанк и добавил его в список fastbins. Когда malloc будет вызван снова и ваш чанк будет соответствовать требованиям, возвращаемый адрес памяти будет указывать на контролируемую вами область памяти.

1664161770517.png




1664161788221.png


1664161802901.png


До появления бина tcache атакующий должен был создавать соседние поддельные чанки с правильными значениями размера (из-за двойной связи конкретного бина), чтобы пройти проверку валидности аллокатора. Бин tcache (с одинарной связью) упростил ситуацию, поэтому создание одного поддельного куска позволит пройти проверку на валидность.

House of Spirit using tcache

Tcache был введен в glibc 2.26 еще в 2017 году, чтобы ускорить управление кучей. Что касается атаки house of spirit, то это дополнение упростило ситуацию из-за односписочной природы этого бина.

Рассмотрим простой пример:

C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    malloc(1);
    unsigned long long *a;
    unsigned long long fake_chunk[4] __attribute__ ((aligned (16)));

    fake_chunks[1] = 0x40;

    a = &fake_chunks[2];

    free(a);

    printf("Now the next malloc will return the region of our fake chunk at %p, which will be %p!\n", &fake_chunks[1], &fake_chunks[2]);
    printf( "malloc(0x30): %p\n", malloc(0x30));
}

Мы вызываем malloc в строке 6 для инициализации кучи и затем (в строке 7) объявляем указатель на беззнаковую длинную длину (ull). В строке 8 мы объявляем массив ulls и заставляем компилятор выделить его члены на границе 16 байт (аналогично границе чанка). Этот массив будет имитировать чанк, заголовок которого начинается по адресу fake_chunk[0]. Более конкретно, мы имеем следующее соответствие:

fake_chunk[0] → mchunk_prev_size, fake_chunk[1] →mchunk_size (вспомните структуру чанка, чтобы лучше понять эту концепцию):

1664161918661.png



Оператор fake_chunks[1] = 0x40; в строке 10 установит размер фальшивого чанка равным 0x40. Если пока все хорошо, предположим, что злоумышленник сможет перезаписать адрес, на который указывает a. Это предположение представлено оператором a = &fake_chunks[2]; в строке 12. Наконец, free(a) в строке 14 добавит поддельный чанк в корзину tcache, таким образом, следующий вызов malloc (размером 0x30), вернет указатель на контролируемый злоумышленником чанк. Помните, что размер поддельного куска также контролируется злоумышленником, поэтому запрашиваемый размер malloc не будет проблемой для эксплуатации. Давайте загрузим программу в gdb, чтобы получить более глубокое понимание:

1664161951991.png


При main+57 мы будем иметь следующие значения в $rbp-0x30:

1664161980087.png


$rax после main+57 будет указывать на секцию данных поддельного чанка:

1664162009699.png


Вызов free с адресом $rax в $rdi переместит поддельный чанк в tcache:

1664162034060.png


В этот момент фальшивый чанк будет присвоен следующему malloc(0x30). Чтобы сделать ситуацию немного интереснее, добавьте следующие строки в нашу начальную программу (строка 16 и далее):

1664162068013.png



Strcpy уравнивает возможности атакующего контролировать fake_chunk и то, на что указывает str:

1664162091413.png


На этом пока все... увидимся в следующем посте.


The toddler’s introduction to Heap Exploitation, House of Spirit(Part 4.4)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх