2010-02-26 7 views
57

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

Спасибо.

ответ

75

Это хорошая проблема. Чтобы решить эту проблему, вам также придется отключить 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() всегда будет в execu так как он находится в сегменте памяти TEXT. Биты NX вступают в игру, если вы пытаетесь выполнить шеллкод в стеке или куче, что не требуется для этого назначения.

Теперь иди и захлопните это EIP!

+4

спасибо, я буду делать только что :) Ах - как я снова включить защиту не-дерьмо моей машины .. Моя догадка Суды эхо 1>/Труды/SYS/ядро ​​/ randomize_va_space – sa125

+0

@ sa125 yep, вот как его снова включить. На самом деле это то, как вы включаете и выключаете другие модули ядра во время работы системы;) – rook

+9

Кажется, стоит отметить, что в моей системе randomize_va_space по умолчанию было 2, а не 1, поэтому стоит проверить заранее, если вы собираетесь снова включить его. – Rushyo

5

Оцените флаг -fno-stack-protector.

2

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

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

- fmudflap -fmudflapth -fmudflapir

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

26

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

Ввод:

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

+3

Вы не читали ссылку ребятам. Если бы вы это сделали, вы бы знали, что он пытается выполнить g(), которая является функцией, которая скомпилирована в двоичный файл. Это адрес функции. Биты NX вступают в игру, когда вы пытаетесь выполнить shellcode в куче или стеке, его атака намного проще. – rook

+0

Я согласен с тем, что все остальные совершенно неправы, очевидно, что мы единственные 2, которые использовали переполнение буфера. Однако я все еще считаю, что мой ответ более правильный. – rook

+0

Хм, просто наткнулся на ссылку - я думал, что это просто еще один общий, ты прав. Я приношу извинения. –

4

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

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

9

На новых дистрибутивах (по состоянию на 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, а также ,

Смежные вопросы