Подтвердить что ты не робот

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

Теперь иди и скройтесь, что EIP!

Ответ 2

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

Ввод:

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

Ответ 3

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

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

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

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

Отключить DEP:

gcc vuln.c -o vuln_disable_dep -z execstack

Отключить PIE:

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.

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

-fmudflap -fmudflapth -fmudflapir

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