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

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

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

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

Для избежания ошибки "bus error" необходимо тщательно проверять код на наличие ошибок, связанных с указателями и операциями с памятью, а также уделять внимание типам данных и их совместимости при чтении и записи.
Я вижу тут 2 варианта: <br/> <br/> 1. Адрес функции не выровнен, это и вызывает SIGBUS <br/> 2. Тут баг с назначением номеров сигналов и на самом деле тебе поступает SIGSEGV, т.к. адрес неверный <br/> <br/> Второе прямо описывается в man'е <code>man 7 signals</code> <br/> <br/> <blockquote><br/>
BUGS<br/>
       For  example,  an invalid memory access that causes delivery of SIGSEGV<br/>
       on one CPU architecture may cause delivery of SIGBUS on another  archi‐<br/>
       tecture, or vice versa.<br/>
</blockquote> <br/> <br/> Отвечая на твой вопрос, что предотвращает запись в секцию <code>.text</code> - флаги секций. У каждой секции есть свои флаги, которые отвечают за возможности работы с этими секциями. <br/> Для этого можно использовать <code>objdump -h &lt;executable&gt;</code> . В частности, я запустил и вот такой вывод появился для бинарника <br/> <br/> <pre><code>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</code></pre> <br/> <br/> Можешь заметить, что .text помечен как READONLY <br/> <br/>
Если это микроконтроллер, то код вполне может находиться в read-only памяти - на флешке ПЗУ, запись в которую нельзя  выполнить просто по указателю. <br/> В иных случаях за это отвечает модуль MPU (memory protection unit), который кто-то в системе настраивает.
Память помечена, как read-only.
Похожие вопросы