内存保护机制

转个笔记过来
目录:
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 通过各个保护机制的特征来检查是否开启保护

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据