Демонстрація всіх типів слайдів

Лекція 0 — Довідник для викладача

Модуль 0: Інструкція

Основи баз даних та спеціалізовані мови програмування

Ординський Олександр • викладач

ВТФК • Вінниця • 2025

2025

📍 Дорожня карта лекції

  • Огляд всіх 13 типів слайдів
  • Приклади використання кожного типу
  • Рекомендації щодо застосування
  • Технічні деталі JSON структури

Ця лекція демонструє всі доступні типи слайдів

📚 Огляд попередньої лекції

Лекція -1: Вступ до курсу (приклад)

  • Розглянули основні цілі курсу
  • Визначили ключові поняття інформаційної безпеки
  • Обговорили структуру курсу та вимоги
  • Встановили середовище для лабораторних робіт

🔑 Ключове поняття

Buffer Overflow (Переповнення буфера)

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

Аналогія: Уявіть склянку води. Якщо ви ллєте воду понад її край, вода потрапляє на стіл і може зіпсувати документи поруч. Так само переповнення буфера "проливає" дані в сусідні області пам'яті.

📝 Розбір синтаксису функції strcpy()

char *strcpy(char *dest, const char *src);
char * — тип результату — вказівник на рядок символів
strcpy — назва функції для копіювання рядків
char *dest — призначення — буфер, куди копіюються дані
const char *src — джерело — рядок, який копіюється
char * — тип результату — вказівник на рядок символів
strcpy — назва функції для копіювання рядків
char *dest — призначення — буфер, куди копіюються дані
const char *src — джерело — рядок, який копіюється
char * — тип результату — вказівник на рядок символів
strcpy — назва функції для копіювання рядків
char *dest — призначення — буфер, куди копіюються дані
const char *src — джерело — рядок, який копіюється
char * — тип результату — вказівник на рядок символів
strcpy — назва функції для копіювання рядків
char *dest — призначення — буфер, куди копіюються дані
const char *src — джерело — рядок, який копіюється

💻 Приклад уразливого коду

Функція strcpy() не перевіряє розмір буфера призначення:

#include 
#include 

int main() {
    char buffer[8];
    char *input = "Це дуже довгий рядок, який не поміститься";
    
    // НЕБЕЗПЕЧНО! Переповнення буфера
    strcpy(buffer, input);
    
    printf("Buffer: %s\n", buffer);
    return 0;
}

Примітка: Цей код призведе до переповнення буфера, оскільки вхідний рядок більший за розмір buffer[8]

🔍 Покроковий розбір експлойту

Код:

void vulnerable() {
    char buffer[64];
    gets(buffer); // Небезпечна функція!
    printf("Input: %s\n", buffer);
}

int main() {
    vulnerable();
    return 0;
}

Пояснення:

  • char buffer[64]; — виділяє 64 байти на стеку
  • gets(buffer); — читає дані БЕЗ перевірки розміру
  • Якщо ввести > 64 символів, перезапишеться адреса повернення
  • Зловмисник може підмінити адресу повернення на шкідливий код
  • При виході з функції програма перейде за шкідливою адресою

📊 Структура стеку при переповненні

Візуалізація пам'яті під час атаки buffer overflow:

┌──────────────────────┐  ← Вища адреса
│  Адреса повернення   │  ← Перезаписується!
├──────────────────────┤
│  Збережений EBP      │
├──────────────────────┤
│  Локальні змінні     │
├──────────────────────┤
│  buffer[64]          │  ← Початок буфера
└──────────────────────┘  ← Нижча адреса

buffer[64] — виділена область (64 байти)

Адреса повернення — ціль атаки

Напрямок росту стеку — донизу (до нижчих адрес)

buffer[64] — виділена область (64 байти)

Адреса повернення — ціль атаки

Напрямок росту стеку — донизу (до нижчих адрес)

buffer[64] — виділена область (64 байти)

Адреса повернення — ціль атаки

Напрямок росту стеку — донизу (до нижчих адрес)

⚖️ Порівняння небезпечних і безпечних функцій

❌ Небезпечні функції

  • gets() — не обмежує розмір вводу
  • strcpy() — не перевіряє межі буфера
  • sprintf() — може переповнити буфер
  • strcat() — ризик переповнення

✅ Безпечні альтернативи

  • fgets(buf, size, stdin) — обмежує розмір
  • strncpy(dest, src, n) — копіює максимум n байтів
  • snprintf(buf, size, fmt) — обмежує вивід
  • strncat(dest, src, n) — обмежена конкатенація

🐛 Налагодження з GDB

Код для налагодження:

#include 

void vulnerable(char *input) {
    char buffer[16];
    strcpy(buffer, input);
}

int main(int argc, char *argv[]) {
    vulnerable(argv[1]);
    return 0;
}

Команди GDB:


gcc -g -fno-stack-protector vuln.c -o vuln

gdb ./vuln

(gdb) break vulnerable

(gdb) run $(python3 -c 'print("A" * 32)')

(gdb) x/32xw $esp

(gdb) info registers

💡 Порада: Використовуйте x/32xw $esp для перегляду вмісту стеку та виявлення переповнення

⚠️ Часта помилка: strlen() без +1

⚠️ ЗАСТЕРЕЖЕННЯ

Багато розробників забувають додавати +1 для null-термінатора при виділенні пам'яті під рядки

❌ Неправильно

// НЕПРАВИЛЬНО!
char *copy_string(const char *src) {
    char *dest = malloc(strlen(src));
    strcpy(dest, src);
    return dest;
}

Виділено недостатньо пам'яті — відсутній байт для '\0'

✓ Правильно

// ПРАВИЛЬНО!
char *copy_string(const char *src) {
    char *dest = malloc(strlen(src) + 1);
    strcpy(dest, src);
    return dest;
}

Додано +1 для null-термінатора '\0' в кінці рядка

✅ Підсумок лекції

  • Розглянули 13 типів слайдів для побудови навчальних презентацій
  • Кожен тип має свою специфічну мету та структуру даних
  • JSON-формат дозволяє легко керувати контентом лекцій
  • Партіали Mustache забезпечують модульність шаблонів
  • Gulp автоматизує процес генерації HTML з JSON

Використовуйте різні типи слайдів для кращого засвоєння матеріалу студентами

💻 Практика: Live Coding

$

Що будемо робити:

Напишемо разом програму для перевірки на переповнення буфера з використанням безпечних функцій

Action Items:

Створити безпечну функцію copy_string з перевіркою розміру
Додати валідацію вхідних даних та тестування
Порівняти з небезпечною реалізацією та знайти вразливості

Готові? Почали кодити!

🚀 Наступні кроки

Наступна лекція:

Лекція 1: Введення в мову C та управління пам'яттю

📚 Корисні ресурси:

📚 Корисні ресурси:

📚 Корисні ресурси:

📚 Корисні ресурси:

Дякую за увагу! 💾

← Повернутися до списку лекцій