0x01 概述
1、操作系统提供了很多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险
(1)Stack Canary
- 栈溢出保护
- 是一种针对缓冲区溢出攻击的缓解手段。当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让Shellcode能够得到执行。当启用栈保护后,函数开始执行的时候,会先往栈里插入Cookie信息,当函数真正返回的时候会验证Cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的是否往往也会将Cookie信息给覆盖掉,导致栈保护检查失败而阻止Shellcode的执行。在Linux中,将Cookie信息称为Canary
- gcc编译程序默认开启
- 添加编译选项 -fno-stack-protector 会关闭程序的stack canary栈保护
(2)NX
- 数据执行保护,NX即No-eXecute(不可执行)的意思,即DEP(Data Execution Prevention)
- 基本原理:是将数据所在内存页标识为不可执行,当程序溢出成功转入Shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
- 一般来说,NX主要是防止直接在栈、堆上运行Shellcode代码。
- gcc默认开启NX
- 添加编译选项-z execstack 会关闭NX保护
(3)PIE
- Position-Independent Executable
- 是一个针对代码段.text、数据段.data、.bss等固定地址的一个防护技术 <