Как отключить оптимизацию компилятора gcc, чтобы включить переполнение буфера
Я работаю над проблемой домашнего задания, которая требует отключения защиты оптимизации компилятора для его работы. Я использую gcc 4.4.1 на ubuntu linux, но не могу понять, какие флаги являются правильными. Я понимаю, что это зависит от архитектуры-моя машина работает с 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 отключены, это должна быть прямая атака, как описано в разбивая стек для удовольствия и прибыли
вот список функций безопасности, используемых в Ubuntu: https://wiki.ubuntu.com/Security/Features вам не нужно беспокоиться о NX битах, адрес g() всегда будет находиться в исполняемой области памяти, потому что он находится в сегменте текстовой памяти. 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 и Nonexec Ubuntu (который был помещен в 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 или нет(независимый от позиции код должен быть установлен), используйте: закаливание-проверить executable_name
Я не буду цитировать всю страницу, но все руководство по оптимизации доступно здесь: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Optimize-Options
от звуков его вы хотите хотя бы
-O0по умолчанию, и:- fmudflap -fmudflapth-fmudflapir
для интерфейсов, которые поддерживают его (C и C++), инструмент все рискованно разыменование указателя / массива операции, некоторые стандартные библиотеки функции string/heap и некоторые другие связанные конструкции с тесты/диапазон действия. Модули так инструментальный должен быть невосприимчив к переполнение буфера, недопустимое использование кучи , и некоторые другие классы C / C++ ошибка в программе. Этот инструментарий опирается на отдельном библиотека времени выполнения (libmudflap), который будет связан с программой, если - fmudflap дается во время ссылки. Поведение инструментированных программа управляется с помощью Переменная среды MUDFLAP_OPTIONS. Видеть env MUDFLAP_OPTIONS= - help a. out для своих вариантов.
Comments