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

StackOverflow https://stackoverflow.com/questions/2340259

Вопрос

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

Спасибо.

Это было полезно?

Решение

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

Отключить ASLR:

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

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

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

После отключения canaries и 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 и довольно прост в обходе, см. защита (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 не вступит в силу.

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

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

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

-фмудфлап -фмудфлаптх -фмудфлапир

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top