Вимкніть захист стека на Ubuntu для переповнення буфера без прапорців компілятора C


10

Я хотів би спробувати деякі коди оболонок, і я хочу відключити захист Linux.

Я знаю, що я міг би компілювати за допомогою прапорів, але я знаю, що існує інший спосіб відключити ці захисти взагалі, я просто не можу згадати. Можеш допомогти мені?

Відповіді:


6

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


6
ASLR вимагає від ОС це робити під час виконання. NX біти також потребують системної підтримки. Яку частину не можна відключити під час виконання?
— Джефф Ферланд

25

Щоб розширити те, про що говорив vonbrand (правильно, +1), до захисту стека Linux є дві частини.

Укладайте канарки

Канальні стеки - це функція, яку підтримує компілятор, на яку посилається Фон. Їх неможливо відключити без перекомпіляції.

Щоб довести це собі і побачити, як вони працюють, візьміть наступний код:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

int mybadfunction(char* a_bad_idea)
{
    char what[100];
    strcpy(what, a_bad_idea);
    printf("You passed %s\n", what);
}

int main(int argc, char** argv)
{
    printf("Tralalalaala\n");
    mybadfunction(argv[1]);
}

Тепер компілюйте це ( gcc -fstack-protector -masm=intel -S test.c) у щось gnu, як було б радий зібрати та прочитати вихід. Важливим моментом є те, що при виході з mybadfunctionфункції є цей маленький фрагмент коду:

    mov edx, DWORD PTR [ebp-12]
    xor edx, DWORD PTR gs:20
    je  .L2
    call    __stack_chk_fail

Як ви здогадаєтесь, це отримання файлу cookie стека [ebp-12]та порівняння його зі значенням at gs:20. Не відповідає? Потім він викликає функцію __stack_chk_failв glibc, яка вбиває вашу програму саме там.

Існують способи подолати це з точки зору написання подвигів, але простий спосіб з точки зору побудови тестового коду оболонки - це складання вашої програми -fno-stack-protector.

Невиконані сторінки

Є деякі інші міркування щодо сучасних систем Linux. Якщо ви берете звичайну заглушку для тестування оболонок:

char buffer[] = {...};

typedef void (* func)(void);

int main(int argc, char** argv)
{
    func f = (func) buffer;
    f();
    return 0;
}

сучасний GCC / Linux буде відображати .rodataрозділ файлу PE, який читається лише без дозволів на виконання. Вам потрібно вимкнути це, що можна зробити за допомогою зразка коду з цієї публікації в блозі . Основна ідея: ви використовуєте mprotectдля додавання потрібних дозволів до сторінок, на яких знаходяться дані оболонки.

Невиконані стеки

Якщо ви збираєтеся перевірити традиційний сценарій експлуатації, наприклад, мій поганий код вище, з вашим кодом оболонки, то вам також потрібно забезпечити виконання стека для простих випадків. Формат файлу PE містить поле для визначення того, чи є стек виконуваним - ви можете запитувати і керувати цим за допомогою execstack . Щоб увімкнути виконуваний стек, запустіть

execstack -s /path/to/myprog

Це можна зробити в довільних програмах без необхідності перекомпіляції, але автоматично не відключати канали стеків, оскільки вони записуються під час компіляції.

Доданий бонус: aslr:

Для того, щоб перетворити це геть, echo 0 > /proc/sys/kernel/randomize_va_space.

Ти щойно сказав комусь, як використовувати мій дорогоцінний пінгвін?

Ні. Будь-який експлуататор повинен працювати навколо каналів стеків (дуже нетривіально) і або знаходити програму з execstackнабором, або встановлювати її (це означає, що вона вже може виконувати довільні команди в будь-якому випадку) або використовувати інші складніші методи, наприклад повернення до libc / return орієнтоване програмування.


0

За допомогою цих параметрів можна відключити деякі захисти (виявлення розбиття стека та зробити стек виконаним).

--z execstack
-f no-stack-protector

Ви також можете вимкнути ASLR (рандомізація розташування адресного простору) за допомогою Bash за допомогою команди:

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