Переполнение буфера в 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.