Как отключить оптимизацию компилятора gcc для включения переполнения буфера

Я работаю над проблемой домашней работы, которая требует отключения защиты оптимизации компилятора для его работы. Я использую gcc 4.4.1 на Linux Ubuntu, но не могу понять, какие флаги являются правильными. Я понимаю, что это зависит от архитектуры - моя машина работает с 32-битным процессором Intel.

Благодарю.

6 ответов

Решение

Это хорошая проблема. Чтобы решить эту проблему, вам также придется отключить ASLR, иначе адрес g() будет непредсказуемым.

Отключить ASLR:

sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

Отключить канареек:

gcc overflow.c -o overflow -fno-stack-protector

После того, как канарейки и ASLR отключены, это должна быть прямая атака, подобная описанной в Smashing the Stack для получения удовольствия и прибыли.

Вот список функций безопасности, используемых в Ubuntu: https://wiki.ubuntu.com/Security/Features Вам не нужно беспокоиться о битах NX, адрес g() всегда будет в исполняемой области памяти потому что он находится в сегменте памяти TEXT. Биты NX вступают в игру, только если вы пытаетесь выполнить шелл-код в стеке или куче, что не требуется для этого назначения.

Теперь иди и заткни этот EIP!

Хм, все ответы до сих пор были неверными, а ответ Ладьи был правильным.

Ввод:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

С последующим:

gcc -fno-stack-protector -z execstack -o bug bug.c

Отключение ASLR, SSP/Propolice и Ubuntu NoneXec (которое было размещено в 9.10 и довольно простое в использовании, см. Метод mprotect(2) для отображения страниц как исполняемого и jmp) должен немного помочь, однако эти "функции безопасности" не значит непогрешимый. Без флага `-z execstack'страницы имеют неисполняемые маркировки стека.

В более новых дистрибутивах (по состоянию на 2016 г.) PIE, по-видимому, включен по умолчанию, поэтому вам нужно явно отключить его при компиляции.

Вот небольшая сводка команд, которые могут быть полезны при локальной игре с упражнениями по переполнению буфера:

Отключить канарейку:

gcc vuln.c -o vuln_disable_canary -fno-stack-protector

Отключить DEP:

gcc vuln.c -o vuln_disable_dep -z execstack

Отключить пирог:

gcc vuln.c -o vuln_disable_pie -no-pie

Отключите все перечисленные выше защитные механизмы (предупреждение: только для локального тестирования):

gcc vuln.c -o vuln_disable_all -fno-stack-protector -z execstack -no-pie

Для 32-битных машин вам нужно добавить -m32 параметр также.

Попробуйте -fno-stack-protector флаг.

Я знаю, что это старый поток, но я хочу отметить, что вам не нужно отключать ASLR для переполнения буфера! Хотя ASLR включен (kernel_randomize_va_space = 2), он не вступит в силу, если скомпилированный исполняемый файл не является PIE, поэтому если вы не скомпилировали свой файл с флагом -fPIC -pie, ASLR не вступит в силу.

Я думаю, что достаточно только отключить канареек с -fno-stack-protector. Если вы хотите проверить, работает ли ASLR или нет (должен быть задан независимый от положения код), используйте: hardening-check ecutable_name

Я не буду цитировать всю страницу, но полное руководство по оптимизации доступно здесь: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html

Из звуков этого ты хочешь хотя бы -O0, по умолчанию, и:

-fmudflap -fmudflapth -fmudflapir

Для внешних интерфейсов, которые его поддерживают (C и C++), используйте все рискованные операции разыменования указателя / массива, некоторые стандартные библиотечные функции строк / кучи и некоторые другие связанные конструкции с тестами диапазона / допустимости. Инструментированные таким образом модули должны быть защищены от переполнения буфера, неправильного использования кучи и некоторых других классов ошибок программирования C/C++. Инструментарий опирается на отдельную библиотеку времени выполнения (libmudflap), которая будет связана с программой, если во время соединения указан ключ -fmudflap. Поведение инструментальной программы во время выполнения контролируется переменной среды MUDFLAP_OPTIONS. Смотрите env MUDFLAP_OPTIONS=-help a.out для его параметров.

Другие вопросы по тегам