Кейс (C): Объясните, что делает следующий код и найдите все возможные ошибки и уязвимости —
char buf[8]

13 Ноя в 09:40
7 +7
0
Ответы
1
Что делает:
- Объявляет массив из 8 элементов типа char: ‘charbuf[8];‘`char buf[8];`charbuf[8];.
- Если объявлен внутри функции — автоматическая (stack) память; если на уровне файла или с `static` — статическая инициализация нулями.
- Размер в байтах: sizeof(buf)=8\text{sizeof(buf)} = 8sizeof(buf)=8.
Основные ограничения и гарантии:
- Валидные индексы для доступа к элементам: 0≤i≤70 \le i \le 70i7.
- Для C-строки (нуль-терминированной) максимально допустимая длина символов LLL0≤L≤70 \le L \le 70L7 с символом `'\0'` на позиции индекса 777 в случае L=7L=7L=7.
Возможные ошибки и уязвимости
1. Буферное переполнение (out-of-bounds write):
- Запись по индексу i≥8i \ge 8i8 или i<0i < 0i<0 — неопределённое поведение и возможная порча соседних данных (return address, frame pointer) -> эксплуатация (stack overflow, ROP, ret2libc).
2. Off-by-one при работе со строками:
- Копирование строки длиной 8 символов с терминирующим нулём не влезет; часто ошибка: копировать по длине источника без учёта `'\0'`.
3. Чтение неинициализированной памяти:
- Если `buf` автоматический и не инициализирован, чтение даст непредсказуемые значения / утечку информации.
4. Утечка информации:
- Если содержимое неинициализировано или не очищено перед отдачей (например, в логах), может раскрыть предыдущие данные.
5. Неправильное использование размера при передаче в функцию:
- При передаче `buf` как параметра массив декейит в `char*`; в вызываемой функции `sizeof(arg)` даст sizeof(char*)\text{sizeof(char*)}sizeof(char*), а не 888.
6. Dangling pointer:
- Возврат указателя на `buf`, если оно локальное, приведёт к доступу к освобождённой памяти.
7. Неправильный выбор функции копирования:
- Использование небезопасных `gets`, `strcpy`, `sprintf` и т.п. приводит к переполнениям.
8. Целочисленные ошибки при расчётах размеров:
- Неверный расчёт количества байт для `memcpy`/`memmove` (например, переполнение размеров) приводит к OOB копированию.
9. Сопутствующие эксплуатационные факторы:
- При наличии защит (canary, NX, ASLR) эксплуатация сложнее, но возможны обходы (например, ROP) при успешном переполнении.
Как уменьшить риск (кратко):
- Использовать явную проверку размеров: при копировании байтов n≤8n \le 8n8; для строк копировать не более 777 символов плюс `'\0'`.
- Использовать безопасные функции: `strncpy`/`strlcpy` с явной постановкой `'\0'`, `memcpy`/`memmove` с проверкой размеров.
- Инициализировать: `char buf[8] = {0};` если требуется.
- Не возвращать указатель на локальный `buf`.
- Проверять индексы и вычислять размеры через `sizeof(buf)` в той функции, где массив видим.
- Включать защитные механизмы компилятора и анализ: ASan, -fstack-protector, -D_FORTIFY_SOURCE, статический анализ.
Краткая сводка формул:
- размер массива: sizeof(buf)=8\text{sizeof(buf)} = 8sizeof(buf)=8
- допустимые индексы: 0≤i≤70 \le i \le 70i7
- для копирования сырых байт: n≤8n \le 8n8
- для C-строки (с нулём): L≤7L \le 7L7 (где LLL — число видимых символов)
13 Ноя в 09:48
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир