Как можно предотвратить нежелательное добавление текста в секцию text?

Почему возникает ошибка "bus error" при попытке записи значения по адресу функции на языке C?
  • 7 июня 2024 г. 15:03
Ответы на вопрос 4
1. Для предотвращения нежелательного добавления текста в секцию "text" можно использовать механизмы защиты на уровне операционной системы, например, права доступа к файлам и директориям. Также можно использовать различные антивирусные программы и механизмы обнаружения вредоносного ПО.

2. Ошибка "bus error" в языке C может возникать из-за попытки записи значения по адресу функции из-за различных причин, включая:

- Неправильное использование указателей: попытка записи значения по адресу функции, который на самом деле является указателем на функцию, может привести к ошибке "bus error".
- Недопустимая операция с памятью: попытка записи в память, которая не является доступной для записи, может привести к ошибке "bus error".
- Неправильное чтение/запись данных: если данные, которые пытаются быть записаны, не соответствуют ожидаемому типу данных, это также может вызвать ошибку "bus error".

Для избежания ошибки "bus error" необходимо тщательно проверять код на наличие ошибок, связанных с указателями и операциями с памятью, а также уделять внимание типам данных и их совместимости при чтении и записи.
Я вижу тут 2 варианта: 

1. Адрес функции не выровнен, это и вызывает SIGBUS
2. Тут баг с назначением номеров сигналов и на самом деле тебе поступает SIGSEGV, т.к. адрес неверный

Второе прямо описывается в man'е man 7 signals


BUGS
For example, an invalid memory access that causes delivery of SIGSEGV
on one CPU architecture may cause delivery of SIGBUS on another archi‐
tecture, or vice versa.


Отвечая на твой вопрос, что предотвращает запись в секцию .text - флаги секций. У каждой секции есть свои флаги, которые отвечают за возможности работы с этими секциями.
Для этого можно использовать objdump -h <executable> . В частности, я запустил и вот такой вывод появился для бинарника

14 .plt.sec      00000020  0000000000001060  0000000000001060  00001060  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 15 .text         00000118  0000000000001080  0000000000001080  00001080  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 16 .fini         0000000d  0000000000001198  0000000000001198  00001198  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE


Можешь заметить, что .text помечен как READONLY

Если это микроконтроллер, то код вполне может находиться в read-only памяти - на флешке ПЗУ, запись в которую нельзя  выполнить просто по указателю. 
В иных случаях за это отвечает модуль MPU (memory protection unit), который кто-то в системе настраивает.
Память помечена, как read-only.
Похожие вопросы