程序保护机制

程序保护机制

1) NX:

数据执行保护,即DEP (Data Execution Prevention),(non-executable memory)中执行指令。在80x86体系结构中,操作系统的内存管理是通过页面表(page table)存储方式来实现的,其最后一位就是NX位,0表示允许执行代码,1表示禁止执行代码。一般来说,NX主要是防止直接在 栈(stack) 和 堆(heap) 上运行shellcode代码。gcc默认开启不可执行栈功能,添加编译选项-z execstack即可开启栈可执行功能。

2)ASLR:

地址空间随机化,/proc/sys/kernel/randomize_va_space里的值可以控制系统级的ASLR,使用root权限可以进行修改,有三个值可以设置,具体说明如下。
·0:关闭ASLR。
·1:mmap base、stack、vdso page将随机化。这意味着”.so”文件将被加载到随机地址。链接时指定了-pie 选项的可执行程序,其代码段加载地址将被随机化。配置内核时如果指定了 CONFIG_COMPAT BRK,则 randomize_va_space 默认为1,此时heap没有随机化。
·2:在1的基础上增加了heap随机化。配置内核时如果禁用 CONFIG_COMPAT_BRK,则 randomize_va_space 默认为2。ASLR可以保证在每次程序加载的时候自身和所加载的库文件都会被映射到虚拟地址空间的不同地址处。

3) PIE:

代码段随机化,具体见ASLR。

4) RELRO:

重定位,一般会分为两种情况, 即 partial relro 和 fullrelro,具体区别就是前者重定位信息(如got表)可写,而后者不可写。

5) STACK CANARY:

栈溢出保护,gcc编译程序默认开启,添加编译选项 -fno-stack- protector 会关闭程序的stack canary栈保护。