linux下ELF文件的5中保护模式

“”
1、CANARY : 栈保护 ,当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。

2、FORTIFY : gcc的新的为了增强保护的一种机制,防止缓冲区溢出攻击。(程序报错,如:JarvisOJ 的pwn题中名为 smarshes )
英文资料:
GCC compiler and GLIBC C library from Fedora Core 4 onwards has gained a feature called “FORTIFY_SOURCE” that will detect and prevent a subset of the buffer overflows before they can do damage. The idea behind FORTIFY_SOURCE is relatively simple: there are cases where the compiler can know the size of a buffer (if it’s a fixed sized buffer on the stack, as in the example, or if the buffer just came from a malloc() function call). With a known buffer size, functions that operate on the buffer can make sure the buffer will not overflow. FORTIFY_SOURCE in Fedora 8 has been enhanced to cover C++ in addition to C, which prevents many security exploits.
翻译:
来自Fedora Core 4的GCC编译器和GLIBC C库已经获得了一个名为“FORTIFY_SOURCE”的功能,它将在它们可以造成损坏之前检测并防止缓冲区溢出的一部分。 FORTIFY_SOURCE背后的想法比较简单:有些情况下编译器可以知道缓冲区的大小(如果它是堆栈中的固定大小的缓冲区,如示例中,或者缓冲区刚刚来自malloc()函数调用)。 使用已知的缓冲区大小,在缓冲区上运行的函数可以确保缓冲区不会溢出。 Fedora 8中的FORTIFY_SOURCE除了C之外,已经得到了增强,涵盖了C ++,从而防止了许多安全漏洞。

3、NX : NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
(针对栈上执行 shellcode 的题,如:JarvisOJ 的pwn题中名为 level1 )

4、PIE : disabled PIE(ASLR)一般情况下NX(Windows平台上称其为DEP)和地址空间分布随机化(ASLR)会同时工作
(针对通过固定的so库获取相关函数的题,可以暴力破解:由于程序每次运行是Libcaddress的地址都是不同的,但是们可以写一个确定的。然后不断运行exp,就会在某一次中,程序加载到我们写的那个exp的 libc_address 的地址。)

5、RELRO : 设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。RELRO为” Partial RELRO”,说明我们对GOT表具有写权限
(针对 格式化字符串修改 got 表 ,来获取 shell 的题,如: 2016cctf pwn3)