Як вимкнути оптимізацію компілятора gcc, щоб увімкнути переповнення буфера


76

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

Дякую.

Відповіді:


105

Це хороша проблема. Для вирішення цієї проблеми вам також доведеться вимкнути ASLR, інакше адреса g () буде непередбачуваною.

Вимкнути ASLR:

Відключити канарки:

Після відключення канарок та ASLR це має бути пряма атака, подібна до тих, що описані в " Розбиття стека для розваги та прибутку"

Ось список функцій безпеки, які використовуються в ubuntu: https://wiki.ubuntu.com/Security/Features Вам не потрібно турбуватися про біти NX, адреса g () завжди буде в виконуваній області пам'яті оскільки він знаходиться в сегменті пам’яті ТЕКСТ. Біти NX вступають у дію лише в тому випадку, якщо ви намагаєтесь виконати код оболонки в стеку або купі, що не потрібно для цього призначення.

А тепер вирушайте на EIP !


5
дякую, я зроблю саме це :) О - як я можу знову ввімкнути захист, щоб розпакувати мою машину? .. Моє припущення - sudo echo 1> / proc / sys / kernel / randomize_va_space
sa125

@ sa125 так, ось як його знову ввімкнути. Насправді саме так ви вмикаєте та вимикаєте інші модулі ядра під час роботи системи;)
грак

14
Здається, варто зазначити, що в моїй системі randomize_va_space за замовчуванням було встановлено 2, а не 1, тому варто заздалегідь перевірити, чи маєте ви намір її знову активувати.
Rushyo

4
Насправді адреса g (), швидше за все, не буде рандомізовано ASLR, оскільки вона є частиною основного двійкового файлу. Тільки якщо ви скомпілюєте двійковий файл за допомогою -PIE, він буде рандомізований.
Роберт Ларсен

33

Урм, всі відповіді на даний момент були помилковими, оскільки відповідь Рука була правильною.

Введення:

Далі:

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


4
Ви не читали посилання для хлопців. Якби ви це зробили, ви б знали, що він намагається виконати g (), яка є функцією, яка компілюється в двійковий файл. Це адреса функції. Біти NX вступають у дію, коли ви намагаєтесь виконати код оболонки в купі або стеку, його атака набагато простіша.
грак

Я згоден з тим, що всі інші абсолютно помиляються, очевидно, що ми єдині 2, хто використав переповнення буфера. Однак я все ще вважаю, що моя відповідь є більш правильною.
грак

Хм, щойно натрапив на посилання - я думав, це просто черговий загальний засіб, ти маєш рацію. Я прошу вибачення.

Я знаю, що це стара публікація, але ви не можете використовувати sudo з> <, оскільки це не дозволить. Команда повинна бути: echo 0 | sudo tee / proc / sys / kernel / randomize_va_space
Boogy

20

У нових дистрибутивах (станом на 2016 рік) здається, що PIE увімкнено за замовчуванням, тому вам потрібно буде відключити його явно під час компіляції.

Ось невеликий підсумок команд, які можуть бути корисними при локальній грі з вправами переповнення буфера загалом:

Вимкнути канарку:

Вимкнути DEP:

Вимкнути PIE:

Вимкніть усі перелічені вище механізми захисту (попередження: лише для місцевого тестування):

Для 32-розрядних машин вам також потрібно буде додати -m32параметр.


7

Вам не потрібно вимикати ASLR, щоб зробити переповнення буфера! Незважаючи на те, що ASLR увімкнено ( kernel_randomize_va_space = 2), він не набере чинності, якщо скомпільований виконуваний файл не є PIE. Отже, якщо ви не скомпілювали свій файл із -fPIC -pieпрапором, ASLR не набере чинності.

Думаю, достатньо лише відключити канарок -fno-stack-protector. Якщо ви хочете перевірити, працює ASLR чи ні (повинен бути встановлений незалежний від місця код), використовуйте:



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 щодо його опцій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.