我正在学习堆栈缓冲区溢出利用,后来我发布了一个问题Shellcode 分段错误。关于从测试程序执行 shellcode 或将其注入易受攻击的程序会导致分段违规。现在我发现这可能是由 NX 引起的。当我在 dmesg 中搜索时,我发现了这一行:
[ 0.000000] NX (Execute Disable) protection: active
所以我的问题是如何在 Linux 上禁用 NX 位。我正在使用带有 4.18.0 内核的 Kali Linux 64 位。
答案1
您可以在 Linux 上全局禁用 NX,方法是noexec=off
在内核命令行:
noexec [X86]
On X86-32 available only on PAE configured kernels.
noexec=on: enable non-executable mappings (default)
noexec=off: disable non-executable mappings
noexec32 [X86-64]
This affects only 32-bit executables.
noexec32=on: enable non-executable mappings (default)
read doesn't imply executable mappings
noexec32=off: disable non-executable mappings
read implies executable mappings
READ_IMPLIES_EXEC
您还可以通过以下方式设置执行域来禁用进程的 NXpersonality(2)
或者,在较旧的内核中,通过 启用可执行堆栈PT_GNU_STACK
。这对于现代内核来说并不适用,因为现代内核不再设置该执行域当堆栈可执行时。
犯罪12230611改变了行为,因此设置PT_GNU_STACK
为可执行文件不再将每个页面标记为可执行文件,并提交9fccc5c0使得删除PT_GNU_STACK
仅在完全缺乏 NX 支持的系统上或在 ia32 架构上可执行的所有页面。