PIE(ASLR) 代码段、数据段地址随机化
进程地址空间各区域随机化的措施,称之为ASLR(Address Space Layout Randomization)。ASLR通过随机放置进程关键数据区域的地址空间来防止攻击者能可靠地跳转到内存的特定位置来利用函数。现代操作系统一般都加设这一机制,以防范恶意程序对已知地址进行Return-to-libc攻击。
-fpie -pie // 开启PIE,此时强度为1
-fPIE -pie // 开启PIE,此时为最高强度2
CANARY 堆栈溢出保护
栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。
-fno-stack-protector // 禁用
-fstack-protector // 开启
-fstack-protector-all // 完全开启
NX(DEP) 堆栈禁止执行
NX(No-eXecute),基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
-z execstack // 禁用NX保护
-z noexecstack // 开启NX保护
RELRO GOT写保护
设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。
-z norelro // 关闭
-z lazy // 部分开启
-z now // 全部开启
FORTIFY
fority用于检查是否存在缓冲区溢出的错误
-D_FORTIFY_SOURCE=1 // 较弱的检查
-D_FORTIFY_SOURCE=2 // 较强的检查 常用函数加强检查
标签:GCC,参考,保护,开启,NX,编译,地址,执行,溢出 From: https://www.cnblogs.com/sciapex/p/16626492.html