0x00 windows下的内存保护机制 在接触了Linux平台下的栈溢出漏洞攻击,今天便正式开始了windows的学习。在Linux最开始的学习中,我了解到Linux下的内存保护机制: - Canary(栈保护)
- NX(数据执行保护)
- Pie(地址随机化)
- Relro
- Fortify
其中特别隆重介绍了前三种,(后两种利用例子似乎很少)这里就不再赘述。 同样的,在windows下,我们也有类似的内存保护机制: 1、GS:功能类似于Linux的Canary。在缓冲区溢出修改返回地址的实验中,若启用GS选项,就会在函数一开始调用执行的时候保存一个“Security cookie”,并在其他地方(.data段保存一个副本)即如果栈中发生溢出,那么Security cookie就会被先淹没,然后是EBP和返回地址,此时系统再对比Security cookie,就会出现不一样而进入异常处理机制。 绕过方法(尚且先做个总结吧,虽然这些方法还没有接触): (1)利用未被保护的内存 (2)覆盖虚函数 (3)攻击异常处理 (4)同时替换栈中和.data中的Cookie 在上面这四个方法,我从字面意思只能理解第四种方法。o(╥﹏╥)o 然后又百度查资料对其他三条稍作了解了一丢丢......(后续再详谈) 2、SafeSEH:这是一种针对S.E.H攻击的防御措施。查找资料得知,我们可以通过攻击S.E.H(structure exception handler:异常处理结构体,我第一反应是_try(...)catch(...))来绕过GS,或者改写S.E.H堆栈中异常处理的函数指针进行windows漏洞利用。还是简单点来说吧,SafeSEH可以校验S.E.H,从而有效降低通过攻击S.E.H获得控制权的成功率。(不懂?没关系!我也不懂!哈哈哈哈哈) 绕过方法: (1)未启用GS时,攻击返回地址绕过SafeSEH (2)攻击虚函数劫持流程绕过SafeSEH(此时没有用到任何异常处理机制,那么SafeSEH就是一个摆设)(这一点与绕过GS(2)相似) (3)从堆中绕过SafeSEH(之前看过一点点堆,听说比栈难多了) (4)利用未启用SafeSEH模块绕过SafeSEH(我发现这一点也与GS(1)绕过一样,使用未启用的。) (5)利用加载模块之外的地址绕过SafeSEH(这个我无法解释一点点o(╥﹏╥)o) 3、DEP:数据执行保护,规定堆和栈只有读写权限没有执行权限,(资料说是用来弥补冯若依曼设计的图灵机混淆数据和代码的天然缺陷)这个时候我们就必须利用ROP技术将程序自身碎片(gadgets)绕过DEP。值得注意的是:ROP技术的前提是代码片段的地址固定。 (补一句:这个时候就要了解一下PE文件的结构,清楚什么是数据页,什么又是代码页) 绕过方法: (1)(怎么又是)攻击未启用DEP的程序 (2)利用ret2libc挑战DEP(这个我有了Linux的基础,终于懂了一个,不过,听说这一条还可以再细分) (3)利用.NET挑战DEP (4)利用JAVA applet绕过DEP 后面两条感觉(o(╥﹏╥)o) 4、ASLR:地址空间布局随机化,前面几种保护机制都有的共同前提是程序加载基址确定。在Linux缓冲区溢出漏洞实践中,接触到一些。 绕过方法太不普通了!后面操作再细讲。 参考链接: - https://www.cnblogs.com/t1mes/articles/7136728.html
- https://blog.csdn.net/whatday/article/details/82976677
复制代码
|