Переполнение буфера в heap. 1 серия

kas1e

Xakep, номер #057, стр. 057-074-5


printf("after overflow: buf2 = %s\n", buf2);

// освобождаем выделенную память под buf1

free(buf1);

// освобождаем выделенную память под buf2

free(buf2);

}

Откомпилим все это и запустим:

[root@heap_part1]# gcc heap_overflow_base.c -o heap_overflow_base

[root@heap_part1]# ./heap_overflow_base

before overflow: buf2 = AAAAAAAAAAAAAAAA

after overflow: buf2 = BAAAAAAAAAAAAAAA

Segmentation fault

Как видно, до переполнения в buf2 лежат символы "A". После того как мы переполнили buf1, в buf2 появился символ "B". Произошло переполнение буфера в heap. Этот пример опять же очень простой, но он является основой основ и очень важен для понимания работы heap.

Через отладчик посмотрим, в каком именно месте происходит ошибка:

[root@heap_part1]# gdb -q ./heap_overflow_base

(gdb) r

Starting program: /heap_part1/heap_overflow_base

Program received signal SIGSEGV, Segmentation fault.

0x4207acc0 in chunk_free () from /lib/i686/libc.so.6

(gdb) quit

The program is running. Exit anyway? (y or n)

[root@heap_part1]#

Ошибка происходит при освобождении памяти в chunk_free() функции. Почему? Потому что мы перезаписали нашими "B" символами данные, которые нужны функции free() для корректного освобождения памяти.

Заключение

Итак, в первой статье мы рассмотрели необходимую "базу" для понимания техники переполнение буфера в heap: организацию ELF программы в памяти, heap сегмент и функции, работающие непосредственно с динамическим выделением/освобождением памяти из этой самой heap. Конечно, всего этого мало, поэтому я настоятельно рекомендую проштудировать ссылки из блок-врезки, а также почитать мои предыдущие статьи про переполнение буфера в стеке. В следующей части я покажу, каким образом перезаписать данные malloc() так, чтобы выполнился наш код. В итоге будет продемонстрирован рабочий эксплоит, основанный на heap технологии.

Что стоит почитать

w00w00 tutorial

www.w00w00.org/files/articles/heaptut.txt

Один из первых документов про переполнение буфера в heap, появившийся в начале 1999 года.

vudo tutotial

www.synnergy.net/downloads/papers/vudo-howto.txt

Гораздо более подробный документ, в тексте которого разжевывается heap технология, после чего станет ясно, что такое malloc() функция и как ее использовать в переполнении буфера в heap.

Возьми в руки прошлые номера Хакера (с 02.03 по 04.03) и изучи статьи про переполнение буфера в стеке. В номере 04.03 опубликована целая статья, посвященная написанию готового сплоита под популярный wu-ftpd.

Назад на стр. 057-074-4  Содержание