我读过一些有关缓冲区溢出的内容,我不明白的一件事是,据我所知,通常空间无法执行,放置在其中的代码如何运行?
有一个二进制保护调用NX(非可执行堆栈),您可以通过运行命令来检查任何二进制文件的保护
❯ checksec --file test
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
Stripped: No
此处启用了 NX 位,因此输入的任何类型的用户输入都将被视为数据而不是代码,但是如果 NX 位关闭,即如果在那里写入了 NX 禁用,则用户输入将被解释为代码而不是代码数据。
在旧系统中,NX 位不存在,因此 shellcode 注入是可能的,但是现在这些保护几乎存在于所有二进制文件中,如果您编译任何二进制文件,默认情况下这些保护将打开,除非您在编译代码时使用标志另外指定.