Можно ли запускать программы без защиты неисполняемых сегментов в современных ядрах Linux?Linux

Anonymous
Можно ли запускать программы без защиты неисполняемых сегментов в современных ядрах Linux?

Сообщение Anonymous »

Я увлекаюсь кибербезопасностью, особенно темой переполнения буфера. С этой целью я рассматриваю пример, в котором переполнение буфера позволяет злоумышленнику выполнить произвольный код из статически выделенного буфера сообщений (т. е. где-то в сегменте данных). К сожалению, мои усилия терпят неудачу из-за ошибок сегментации, почти гарантированных из-за отсутствия прав на выполнение этого сегмента данных (моя атака работает правильно в стеке исполняемых файлов).
Я хорошо знаю, что есть такие ошибки. опции, позволяющие пометить программу как требующую исполняемого стека, который будет учитываться ядром при загрузке двоичного файла. А именно, вы можете создать такой двоичный файл с помощью

Код: Выделить всё

gcc -z execstack  -o 
Раньше этого было достаточно для получения кучи исполняемых файлов в Linux, поскольку, очевидно, все читаемые страницы тогда рассматривались как исполняемые. Но в более современных ядрах с этой опцией исполняемым становится практически только стек.
Я также хотел бы упомянуть два предыдущих вопроса из сети Stackexchange, касающихся этой темы:
  • Первый: относится к системному вызову mprotect, который позволяет вручную переопределить характеристики страниц изнутри программы. К сожалению, для моих целей этот подход неприменим, так как у меня нет такого контроля над программой и я пытаюсь в первую очередь установить возможность выполнения кода.
  • Во-вторых one: отмечает, что поведение execstack в Linux действительно менялось некоторое время между версиями ядра, поэтому обходным путем может быть использование старого ядра Linux (возможно, до 5.4.0) с опцией компоновщика -z execstack при компиляции. тот двоичный. К сожалению, сам вопрос (что привело к этому изменению) остается без ответа.
Итак, есть ли какой-нибудь способ в современном Linux запустить программу без защиты исполняемости на сегментах, не меняя сам код программы? В противном случае есть ли способ хотя бы сделать сегмент кучи/данных исполняемым? Или можно сделать так, что только стек вообще можно сделать исполняемым?

Подробнее здесь: https://stackoverflow.com/questions/792 ... tection-in

Вернуться в «Linux»