Linux常用保护机制
Linux程序常见用的一些保护机制 一、NX(Windows中的DEP)NX:No-eXecute、DEP:Data Execute Prevention
gcc -o test test.c // 默认情况下,开启NX保护 gcc -z execstack -o test test.c // 禁用NX保护 gcc -z noexecstack -o test test.c // 开启NX保护 二、PIE(ASLR)PIE:Position-Independent Excutable、ASLR:Address Space Layout Randomization
-fpic Generate position-independent code (PIC) suitable for use in a shared library,if supported for the target machine. Such code accesses all constant addresses through a global offset table (GOT). The dynamic loader resolves the GOT entries when the program starts (the dynamic loader is not part of GCC; it is part of the operating system). If the GOT size for the linked executable exceeds a machine-specific maximum size,you get an error message from the linker indicating that -fpic does not work; in that case,recompile with -fPIC instead. (These maximums are 8k on the SPARC,28k on AArch64 and 32k on the m68k and RS/6000. The x86 has no such limit.) Position-independent code requires special support,and therefore works only on certain machines. For the x86,GCC supports PIC for System V but not for the Sun 386i. Code generated for the IBM RS/6000 is always position-independent. When this flag is set,the macros `__pic__` and `__PIC__` are defined to 1. -fPIC If supported for the target machine,emit position-independent code,suitable for dynamic linking and avoiding any limit on the size of the global offset table.This option makes a difference on AArch64,m68k,PowerPC and SPARC. Position-independent code requires special support,and therefore works only on certain machines. When this flag is set,the macros `__pic__` and `__PIC__` are defined to 2. -fpie -fPIE These options are similar to -fpic and -fPIC,but the generated position-independent code can be only linked into executables. Usually these options are used to compile code that will be linked using the -pie GCC option. -fpie and -fPIE both define the macros `__pie__` and `__PIE__`. The macros have the value 1 for `-fpie` and 2 for `-fPIE`.
gcc -fpie -pie -o test test.c // 开启PIE gcc -fPIE -pie -o test test.c // 开启PIE gcc -fpic -o test test.c // 开启PIC gcc -fPIC -o test test.c // 开启PIC gcc -no-pie -o test test.c // 关闭PIE
vDSO:virtual dynamic shared object;
PIE为ASLR的一部分,ASLR为系统功能,PIE则为编译选项。 三、Canary(栈保护)??Canary对于栈的保护,在函数每一次执行时,在栈上随机产生一个Canary值。之后当函数执行结束返回时检测Canary值,若不一致系统则报出异常。
??如上所述,Canary值置于缓冲区和控制数据之间,当缓冲区溢出,该值被覆写,从而可以检测以判断是否运行出错或是受到攻击。缓解缓冲区溢出攻击。
gcc -o test test.c //默认关闭 gcc -fno-stack-protector -o test test.c //禁用栈保护 gcc -fstack-protector -o test test.c //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码 gcc -fstack-protector-all -o test test.c //启用堆栈保护,为所有函数插入保护代码 四、RELRO(RELocation Read Only)在Linux中有两种RELRO模式: Partial RELRO:
Full RELRO:
Note:
参考文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |