NX(DEP)
全名为No-eXecute(不可执行)
开启/关闭方法:
gcc -o test test.c // 默认情况下,开启NX保护
gcc -z execstack -o test1 test.c // 禁用NX保护
gcc -z noexecstack -o test2 test.c // 开启NX保护
-z execstack / -z noexecstack (关闭 / 开启)
看看例子

现在用gdb调试一下看看

这个是默认开启了NX保护的,可以通过 vmmap 指令,看到栈的部分权限是没有x(execute)执行权限的

而这里呢,test1是禁用了NX保护的,栈区的权限多了一个X
具体细节
了解**冯·诺依曼结构的师傅应该知道,它将程序指令存储器和数据存储器合并在一起,使数据和程序以同等地位存放在内存当中**。
NX是**数据与程序的分水岭,栈溢出核心思想是通过局部变量覆盖函数返回地址来修改EIP和注入 Shellcode,在函数返回时跳到Shellcode去执行。要防止这种攻击,最有效的办法就是让攻击者注入的Shellcode无法执行,这就是数据执行保护(Data Execution Prevention, DEP)安全机制的初衷。NX策略是使栈区域的代码无法执行**。
该保护机制用于防范:栈溢出 + shellcode
正常在栈溢出时通过跳转指令跳转至shellcode,但是NX开启后CPU会对数据区域进行检查,当发现正常程序不执行,并跳转至其他地址后会抛出异常,接下来不会继续执行shellcode,而是去转入异常处理,处理后会禁止shellcode继续执行。