Proof of concept example: executing machine code from different memory areas: stack, heap, shared memory
execstack
- utility to mark stack as executable (prelink.rpm
)
$ make
$ ./run_test.sh
- stack
- heap (malloc)
- file/heap (mmap)
- shared memory (shmget)
rw
- allocate memory with read/write permissionsrwx
- allocate memory with read/write/execute permissionsrw-x
- allocate memory with read/write permissions and then manually change permissions torwx
withmprotect
syscall
В разрезе "Обратной связи", интересует вопрос: Насколько опасно и к чему может привести исполняемый код со стэка/кучи/разделяемой памяти?
Стоит учесть, что по умолчанию, у всех приложений стэк / куча / shm - не исполняемые. И если есть, например, косяк в проверке аргументов, и, как следствие, возможность переполнения буфера, ещё не факт что удастся выполнить какой-либо свой код, так как память не исполняемая.
Приложение, может самостоятельно (создать | изменить атрибуты уже существующей) исполняемый участок памяти. Но стэк, по нормальному, никто исполняемым делать не будет, а кучу или shm "переполнять" вроде и некуда, если можно.