Как отключить оптимизацию компилятора 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
параметр также.
Я знаю, что это старый поток, но я хочу отметить, что вам не нужно отключать 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 для его параметров.