Как отключить оптимизацию компилятора gcc для включения переполнения буфера - PullRequest
63 голосов
/ 26 февраля 2010

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

Спасибо.

Ответы [ 6 ]

86 голосов
/ 26 февраля 2010

Это хорошая проблема. Чтобы решить эту проблему, вам также придется отключить 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 !

29 голосов
/ 26 февраля 2010

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

Ввод:

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 'страницы имеют неисполняемые маркировки стека.

13 голосов
/ 29 ноября 2016

В более новых дистрибутивах (по состоянию на 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.

5 голосов
/ 26 февраля 2010

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

4 голосов
/ 07 апреля 2015

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

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

2 голосов
/ 26 февраля 2010

Я не буду цитировать всю страницу, но полное руководство по оптимизации доступно здесь: 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 для его вариантов.

...