Защита стека.
Stack-Smashing Protector (известный как ProPolice) - это GCC-патч, сделанный компанией IBM. SPP использует технику проверочных значений, как и StackGuard. SPP дает ряд существенных улучшений этой техники по сравнению со StackGuard.
Во-первых, изменилось месторасположение проверочного значения. Теперь оно находится не после адреса возврата, как в случае с StackGuard, а после указателя кадра (Frame Pointer, FP). Если проверочное значение помещается сразу после RET, указатель FP и локальные переменные функции могут быть перезаписаны без изменения проверочного значения (оно применяется только для защиты RET). SPP помещает проверочное значение после FP, чем обеспечивает его защиту, а также изменяет порядок буфера и локальных переменных
При переполнении буфера проверочное значение сразу же увеличивается. Невозможно переполнить стек, чтобы не быть обнаруженным.
Установка SPP.
GCC-патч SPP доступен по адресу: http://www.research.ibm.com/trl/projects/security/spp/ - последний раз были доступны патчи для версий GCC: 2.95.3, 3.3.2, 3.4.2.
Также будет нужен исходный код компилятора GCC соответствующей версии. Список сайтов, с которых можно скачать код GCC, можно найти здесь: http : //www.gnu.org/order/ftp.html.
Архив SPP содержит два патча: protector.dif - дает возможность включить защиту стека с помощью флага компилятора и protectonly.dif - защита стека включится по умолчанию.
Распакуем архивы SPP и GCC, скопируем четыре файла, содержащихся в SPP-архиве, в только что разработанный каталог gcc-х.х.х и применим патч командой:
Для включения защиты по умолчанию:
$ patch -рО < protector.dif
$ patch -рО < protectonly.dif
Теперь откомпилируем GCC. Последовательность его компиляции немного отличается от стандартной ./configure; make; make install, так как доступно очень много дополнительных опций.
Перед установкой первым делом нужно прочитать файл INSTALL. Лучше всего иметь две различные версии GCC, поэтому будет употребляться опция prefix, задающая каталог, в который будет установлена SPP-версия GCC. Стандартная последовательность команд такая:
$ cd obj
$ ../configure -prefix=/usr/spp
$ make bootstrap-lean
# make install prefix=/usr/spp
Использование.
Чтобы защитить программу, надо при ее компиляции указать флаг -fstack-protector. Нужно сразу установить защиту по умолчанию.
Если же для компиляции программы применяется команда make, нужно изменить переменную CFLAGS, которая находится в Makefile - добавить опцию -fstack-protector. Также нужно установить переменную CFLAGS глобально, добавив команду
в файл /etc/profile.
