Stack Overflow

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Що таке переповнення стеку

Переповнення стеку - це вразливість, яка виникає, коли програма записує більше даних у стек, ніж виділено для зберігання. Ці додаткові дані перезапишуть сусідні простори пам'яті, що призведе до порушення дійсних даних, розриву керування та, можливо, виконання зловмисного коду. Ця проблема часто виникає через використання небезпечних функцій, які не виконують перевірку меж введення.

Основна проблема цього перезапису полягає в тому, що вказівники EIP та EBP для повернення до попередньої функції зберігаються в стеці. Тому зловмисник може перезаписати їх і керувати виконанням програми.

Вразливість зазвичай виникає тому, що функція копіює у стек більше байтів, ніж виділено для неї, тому може перезаписати інші частини стеку. Деякі загальні функції, вразливі до цього, це: strcpy, strcat, sprintf, gets, fgets...

Наприклад, наступні функції можуть бути вразливими:

void vulnerable() {
char buffer[128];
printf("Enter some text: ");
gets(buffer); // This is where the vulnerability lies
printf("You entered: %s\n", buffer);
}

Пошук переповнень стеку

Найпоширеніший спосіб знайти переповнення стеку - це ввести дуже великий ввід з A (наприклад, python3 -c 'print("A"*1000)') і очікувати Segmentation Fault, що вказує на те, що була спроба доступу до адреси 0x41414141.

Більше того, якщо ви виявили, що існує уразливість переповнення стеку, вам потрібно знайти зсув, поки буде можливо перезаписати вказівник EIP, для цього зазвичай використовується послідовність Де Брюйна. Яка для заданого алфавіту розміру k та підпослідовностей довжини n є циклічною послідовністю, в якій кожна можлива підпослідовність довжини _n_** з'являється рівно один раз** як послідовність.

Таким чином, замість того, щоб вручну визначати, який зсув перезаписує EIP, можна використовувати одну з цих послідовностей як доповнення, а потім знайти зсув байтів, які закінчили перезаписувати його.

Можна використовувати pwntools для цього:

from pwn import *

# Generate a De Bruijn sequence of length 1000 with an alphabet size of 256 (byte values)
pattern = cyclic(1000)

# This is an example value that you'd have found in the EIP/IP register upon crash
eip_value = p32(0x6161616c)
offset = cyclic_find(eip_value)  # Finds the offset of the sequence in the De Bruijn pattern
print(f"The offset is: {offset}")

або GEF:

#Patterns
pattern create 200 #Generate length 200 pattern
pattern search "avaaawaa" #Search for the offset of that substring
pattern search $rsp #Search the offset given the content of $rsp

Використання переповнення стеку

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

Однак у інших сценаріях можливо, що просто перезапис значень деяких змінних в стеці буде достатньо для експлуатації (наприклад, в простих завданнях CTF).

Ret2win

У цьому типі завдань CTF є функція всередині бінарного файлу, яка ніколи не викликається, і вам потрібно її викликати, щоб перемогти. Для цих завдань вам просто потрібно знайти зсув для перезапису EIP та знайти адресу функції, яку потрібно викликати (зазвичай ASLR буде вимкнено), щоб при поверненні вразливої функції була викликана схована функція:

Ret2Shellcode

Типи захисту

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated