本POC演示了在二进制文件中原本不可执行区域中的字节执行,从而完全绕过了可执行空间保护。
根本原因可在此处查看: https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/elf.h#L280
事实证明,在不支持NX的系统或支持NX的IA32系统上构建的二进制文件,如果没有包含 PT_GNU_STACK 头部,则会被标记为 exec-all。
这使得二进制文件中的任何位置都可以进行完全的读写执行(RWX)。
为了实现这一点,我们使用了“历史性”构建工具。
本例中使用的是运行在 x86 Slackware9 系统(Linux 2.4.20)上的 gcc 3.2.2
最终我们将得到一个可以在现代Linux系统上执行的二进制文件,本例中为 Linux 5.16.1
使用特定的链接器参数/脚本可能也能达到同样的效果,但我并未验证这一点。
以下代码将函数 dummy() 的汇编字节复制到字符数组 harmless_str_buf 中,并将目标数组作为函数执行。
本演示完全出于教育目的。 在任何情况下,本代码的作者均不对 因滥用任何提供的代码和/或信息而导致的任何直接或间接损害负责。
更多详情请参阅 LICENSE