总结一: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保护:

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

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

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

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