Исполнимая "куча" набора

Некоторые BIOS ноутбука (например, Acer TravelMate 5720 с более старым встроенным микропрограммным обеспечением) изменят идентификатор раздела некоторого произвольного раздела к значению, которое это ожидает, что раздел восстановления будет иметь, даже если раздел восстановления больше не будет там, который может представить систему, незагрузочную, если это - раздел начальной загрузки, который изменяется этим способом. Необходимо экспериментировать с этим немного перед установкой, чтобы быть уверенными, что этого не произойдет с Вами.

3
06.12.2011, 18:05
2 ответа

Установка исполняемого стека (или установка неисполняемого стека) не имели никакого значения ни на какой версии Linux, я примерил его (2.6.9 на x86_64, 2.4.21 на x86_64, 2.6.20.9 x86, 3.1.4 x86). У меня нет доступа к Солярису или *машины BSD в данный момент. Я предполагаю, что рассматриваемые ядра не компилируются для запрещения выполнения кода "стека". См. эту статью Википедии, в которой говорится, что или патч или опция компиляции необходимы.

Я записал программу C, которая работает в памяти malloc-редактора. Это продолжает работать все одинаковое ядра и architecutres, который я упомянул выше. Я сомневаюсь, что Вы найдете, что определенный инструмент как execstack отмечает исполняемый файл как "исполняемый файл "кучи"". О лучшем я мог сказать Вам, то, что необходимо будет использовать mprotect() системный вызов. Даже использование mprotect() Я думаю, что Вы найдете, что часть более необычной архитектуры там (старая Альфа DEC или "Архитектура Точности HP") просто никогда не будет позволять выполняться из "кучи".

2
27.01.2020, 21:29
  • 1
    я не думаю старая архитектура, вел бы себя тот путь, используемое оборудование не имеет никакого способа знать, какие страницы памяти являются mmap'ed исполняемыми файлами и которые предназначены для пространства "кучи", если это не сказано. Архитектура, которая не поддерживает что-то как нет - выполняется, флаг на страницах будет всегда иметь исполняемую "кучу" для других, ядро является единственным ограничением. –  wingedsubmariner 27.11.2013, 22:50

Да, как указал Эдигер, вы должны использовать системный вызов mprotect().

Однако, чтобы использовать системный вызов mprotect(), вам нужно выяснить, на какой странице находится ваш адрес памяти. Возможно, номер маски может помочь.

Вот очень простой пример:

int *ptr = malloc(0x1000);
mprotect((long long)ptr & 0xfffffffffffff000, 0x1000, PROT_EXEC | PROT_READ | PROT_WRITE);
ptr[0] = 0xd503201f; // nop
ptr[1] = 0xd503201f; // nop
ptr[2] = 0xd503201f; // nop
ptr[3] = 0xd65f03c0; // ret
void (*foo)(void) = (void (*)())ptr;
foo();
1
16.03.2021, 08:47

Теги

Похожие вопросы