#cpp #linux
Код #includevoid main() { void *p = &&modify; modify: // Перезаписать цифру пять нулем, 18 - это смещение от текущего адреса *(unsigned int *)((unsigned int)p + 18) = 5; printf("This is five = %d\n", 0); } должен сам себя менять. Собирается бинарий gcc selfmodify.c -o selfmodify и снимается запрет на запись на секцию .text objcopy --set-section-flags .text=alloc,code ./selfmodify В итоге все падает с ошибкой сегментации в момент перезаписи нуля пятеркой. У меня возник вопрос, а Linux реально разрешает переписывать свою секцию .text, если в ELF файле снят запрет на запись?
Ответы
Ответ 1
Линукс позволяет переписывать свою секцию .text, если флаг, запрещающий запись, снимается во время исполнения с помощью системного вызова mprotect. Еще надо иметь в виду, что на некоторых процессорах, например, семейства ARM необходимо сбросить кэш, чтобы процессор выполнил именно заново прописанные инструкции вместо закэшированных.Ответ 2
Так вы модифицируете область памяти, а не исполняемый файл. Linux не следит за тем что вы делаете с ней. Так что всё должно работать. Надеюсь вы это в академических целях используете :-)
Комментариев нет:
Отправить комментарий