因为自己学的比较慢,自学能力也比较差,假期过去挺久了,进度也才跟进到保护机制,这次的博客我就来说说最近在学的两种保护机制:NX和Canary。
先来说说NX保护机制,NX典型的例子有ret2syscall和libc,为了便于理解为什么有这种保护机制以及为什么需要这种保护机制,我去网上找了一些NX的原理。
NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
通过学习以及个人的理解,我认为NX保护机制其实就是让我们不能直接利用程序中的某一段代码或者自己填写代码来获得 shell,而是通过其他途径绕过保护机制然后得到shell,例如ret2syscall是利用程序中的 gadgets 来获得 shell,libc则是控制函数的执行 libc 中的函数,通常是返回至某个函数的 plt 处或者函数的具体位置(即函数对应的 got表项的内容)。
而相比之下我认为Canary则需要做题的人多考虑一些东西,下面是我在网上找到的一些原理。
Canary表示栈保护功能有没有开启。栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。
简单的总结一下,canary保护机制会在栈溢出的返回地址上放一个标志,在函数结束时会判断这个标志是否改变,若改变则程序结束。
参考文献:https://www.cnblogs.com/Spider-spiders/p/8798628.html(有需要的可以查看)