Выполнить код в стеке процесса в недавнем Linux - PullRequest
4 голосов
/ 26 июня 2011

Я хочу использовать ptrace для записи части двоичного кода в стек запущенного процесса. Однако это вызывает ошибку сегментации (сигнал 11).

Я могу убедиться, что регистр% eip хранит указатель на первую инструкцию, которую я хочу выполнить в стеке. Я предполагаю, что есть какой-то механизм, который linux защищает данные стека для выполнения.

Итак, кто-нибудь знает, как отключить такую ​​защиту для стека. Конкретно я пробую Fedora 15.

Большое спасибо!


После прочтения всех ответов я попробовал execstack, который действительно делает код в стеке исполняемым. Спасибо всем!

Ответы [ 2 ]

5 голосов
/ 26 июня 2011

Это, вероятно, связано с NX бит на современных процессорах. Вы можете отключить это для вашей программы, используя execstack.

http://advosys.ca/viewpoints/2009/07/disabling-the-nx-bit-for-specific-apps/

http://linux.die.net/man/8/execstack

2 голосов
/ 26 июня 2011

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

РЕДАКТИРОВАТЬ: быстрый Google для этого макроса, дал мне подсказку: mprotect используется для изменения прав доступа к странице памяти. Также будьте осторожны, когда вы генерируете дату и выполняете ее - возможно, вам придется дополнительно очистить кеш инструкций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...