总结一:pwn题中的四大保护:

NX防护

![[Pasted image 20221023181159.png]]

  • 意义No-eXecute不可执行
  • 基本原理是将数据所在内存页标识为不可执行当程序溢出成功转入Shellcode时程序会尝试在数据页面上执行指令此时CPU就会抛出异常而不是去执行恶意指令got ELF while …….{思考如果存在mprotect可以进行NX防护的绕过}
  • 用来防护的攻击手段栈溢出 + 跳到栈上执行shellcode
  • 添加编译选项-z execstack 会关闭NX保护
  • 绕过方式ROP在代码段中寻在合适gadget构造gadget链最终实现获取shell

CANARY保护

![[Pasted image 20221023181117.png]]

  • 栈溢出保护阻止所有单纯的栈溢出
  • 基本原理是一种针对缓冲区溢出攻击的缓解手段当函数存在缓冲区溢出攻击漏洞时攻击者可以覆盖栈上的返回地址来让Shellcode能够得到执行当启用栈保护后函数开始执行的时候会先往栈里插入Cookie信息当函数真正返回的时候会验证Cookie信息是否合法如果不合法就停止程序运行攻击者在覆盖返回地址的是否往往也会将Cookie信息给覆盖掉导致栈保护检查失败而阻止Shellcode的执行在Linux中将Cookie信息称为Canary
  • 通俗解释在栈中紧挨ebp的上一个位置存放一个随机数当发生栈溢出时程序检查CANARY这个值和之前的是否一致如果不一致则 不会往下运行从而避免了缓冲区溢出攻击
    • 添加编译选项 -fno-stack-protector 会关闭程序的stack canary栈保护
  • 绕过方式
    1 获取填充的随机数通过爆破泄露等方法获取随机数制造栈溢出的时候在原有位置写入随机数从而实现Canary的绕过
    2劫持sym.imp.__stack_chk_fail函数若果可以劫持sym.imp.__stack_chk_fail函数使得程序调用它时调用别的函数就可以随意覆写Canary的值而不会触发错误实现Canary的绕过
    具体绕过及例题演示参考 Canary原理及绕过

PIE/ALSR保护

  • Position-Independent Executable
  • 基本原理 应用了PIE的程序在每次加载时都会变换加载基址从而使位于程序本身的gadget也失效
  • 通俗解释PIE enabled如果程序开启这个地址随机化选项就意味着程序每次运行的时候地址都会变化而如果没有开PIE的话那么No PIE(0x400000)括号内的数据就是程序的基地址.
  • 防止攻击手段构造ROP链攻击如ret2libc
  • 添加编译选项 -no-pie 会关闭程序的PIE保护
  • 绕过方式通过泄露libc基址的方法获取libc版本加便宜量来获取基地址

RELRO保护

  • 基本原理 重定位设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号从而减少对GOTGlobal Offset Table攻击

  • 防止攻击者的攻击手段系统调用防止got表的调用

  • 三种保护模式
    1No RELRO
    2Partial RELRO两者区别在于got.plt位于那一段是可读可写的

    3Full RELRO
    .got 与.got.plt都只读不写对got表的一种防护手段