转个笔记过来
目录:
1、Canary
2、RELRO
3、NX(DEP)
4、PIE 与 ASLR
5、FORTIFY
Canary
栈保护,函数开始执行的时候会先往栈底插入特定信息,当函数真正返回的时候会验证这个特点信息是否合法 (栈帧销毁前测试该值是否被改变),如果不合法就停止程序运行 (栈溢出发生)。
绕过方法:
- 泄露 Canary
- one-by-one 爆破 Canary
- 覆盖 TLS 中储存的 Canary 值
- 劫持__stack_chk_fail 函数
RELRO
Relocation Read-Only,重定向只读
Partial RELRO:符号重定向表设置为只读(.got只读,.got.plt可读可写)
Full RELRO:禁止延迟绑定,所有动态符号在程序启动时就解析并完成绑定
NX(DEP)
NX即No-eXecute(windows对应DEP)将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常。
开启后程序仅 .text 节可执行(其余.bss、.data、heap、stack 等均不可执行)
ASLR 与 PIE
ASLR 不负责代码段以及数据段的随机化,这个随程序本身加载地址而变化,由 PIE 做。但是只有在开启 ASLR 之后,PIE 才会生效。
ASLR(地址空间布局随机化):
部分开启:stack、libc 地址随机化
完全开启:再加 heap 地址随机化
但程序本身和 PLT 不变
PIE(位置无关执行):
程序可被加载到任何位置
“ASLR 与 PIE同时开启,攻击者对程序的内存布局一无所知。”
FORTIFY
针对危险函数的检查机制,编译时检查危险,或将危险函数替换为相对安全的函数,降低溢出风险。
checksec 通过各个保护机制的特征来检查是否开启保护