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

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

Спасибо.

66
задан Community 23 May 2017 в 11:55
поделиться

4 ответа

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

Отключите ASLR:

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

Отключите canaries:

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

После отключения canaries и ASLR это должна быть простая атака, подобная той, что описана в Smashing the Stack for Fun and Profit

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

Теперь идите и уничтожьте этот EIP!

91
ответ дан 24 November 2019 в 14:56
поделиться

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

Entering:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

Followed by:

gcc -fno-stack-protector -z execstack -o bug bug.c

Отключает ASLR, SSP/Propolice и NoneXec от Ubuntu (который был установлен в 9.10, и довольно прост в обходе, см. mprotect(2) технику для отображения страниц как исполняемых и jmp) должен немного помочь, однако эти "средства безопасности" отнюдь не безошибочны. Без флага `-z execstack' страницы имеют неисполняемую маркировку стека.

31
ответ дан 24 November 2019 в 14:56
поделиться

Попробуйте использовать флаг -fno-stack-protector.

6
ответ дан 24 November 2019 в 14:56
поделиться

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

2
ответ дан 24 November 2019 в 14:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: