Stack Overflow
Що таке переповнення стеку
Переповнення стеку - це вразливість, яка виникає, коли програма записує більше даних у стек, ніж виділено для зберігання. Ці додаткові дані перезапишуть сусідні простори пам'яті, що призведе до порушення дійсних даних, розриву керування та, можливо, виконання зловмисного коду. Ця проблема часто виникає через використання небезпечних функцій, які не виконують перевірку меж введення.
Основна проблема цього перезапису полягає в тому, що вказівники EIP та EBP для повернення до попередньої функції зберігаються в стеці. Тому зловмисник може перезаписати їх і керувати виконанням програми.
Вразливість зазвичай виникає тому, що функція копіює у стек більше байтів, ніж виділено для неї, тому може перезаписати інші частини стеку.
Деякі загальні функції, вразливі до цього, це: strcpy
, strcat
, sprintf
, gets
, fgets
...
Наприклад, наступні функції можуть бути вразливими:
Пошук переповнень стеку
Найпоширеніший спосіб знайти переповнення стеку - це ввести дуже великий ввід з A
(наприклад, python3 -c 'print("A"*1000)'
) і очікувати Segmentation Fault
, що вказує на те, що була спроба доступу до адреси 0x41414141
.
Більше того, якщо ви виявили, що існує уразливість переповнення стеку, вам потрібно знайти зсув, поки буде можливо перезаписати вказівник EIP, для цього зазвичай використовується послідовність Де Брюйна. Яка для заданого алфавіту розміру k та підпослідовностей довжини n є циклічною послідовністю, в якій кожна можлива підпослідовність довжини _n_** з'являється рівно один раз** як послідовність.
Таким чином, замість того, щоб вручну визначати, який зсув перезаписує EIP, можна використовувати одну з цих послідовностей як доповнення, а потім знайти зсув байтів, які закінчили перезаписувати його.
Можна використовувати pwntools для цього:
або GEF:
Використання переповнення стеку
Під час переповнення (припускаючи, що розмір переповнення достатньо великий), ви зможете перезаписати значення інших змінних в стеці до досягнення EBP та EIP (або навіть більше). Найпоширеніший спосіб зловживання цим типом вразливості полягає в зміні вказівника EIP, щоб при завершенні функції керування буде перенаправлено туди, куди користувач вказав у цьому вказівнику.
Однак у інших сценаріях можливо, що просто перезапис значень деяких змінних в стеці буде достатньо для експлуатації (наприклад, в простих завданнях CTF).
Ret2win
У цьому типі завдань CTF є функція всередині бінарного файлу, яка ніколи не викликається, і вам потрібно її викликати, щоб перемогти. Для цих завдань вам просто потрібно знайти зсув для перезапису EIP та знайти адресу функції, яку потрібно викликати (зазвичай ASLR буде вимкнено), щоб при поверненні вразливої функції була викликана схована функція:
Ret2Shellcode
Типи захисту
Last updated