本文共 810 字,大约阅读时间需要 2 分钟。
看文章如果没有点产出,过个一两天可能啥都不记得了。于是就有了这篇水文。
paper下载地址:
这篇paper很短,只有三页,来自上海交通大学信息工程学院,总结了三种heap spray的检测方法。
最早,skylined 2004年在IE frame漏洞的exp中利用了heap spray。攻击原理见ppt。
基于字符串的检测,本质是检测内存中是否出现nop+retaddr的字符串。开源snort检测x86下的shellcode就是只检测大量nop这样的指令,但是误报率高。Ratanaworabhan 对heap内存中的字符串进行反汇编,建立CFG(控制流程图),看看是否有大量的块是否都指向一个小块(其实就是nop+retaddr 指向shellcode),超过阀值就报警。
基于内存保护的检测,两种方式:堆内预分配和dep。
堆内预分配:heap spray中会经常出现0x0c0c0c0c这样的retaddr,so操作系统会预先在这里分配数据。 dep和dep衍生。dep就是数据不可执行,衍生是Gadaleta来做的,主要是针对浏览器来做的。把内存中的字符串0x90909090用0xcc分割,并记录分割过的位置。合法的访问时,恢复对应的字符串。如果非法访问时,没有这样的记录,不恢复字符串,就gg。(这样其实阻止组织heap spray的,降低概率。但是我觉得这样一点都不优雅)基于系统调用的检测。heap spray本质最终是调用系统调用,so可以拦截int 0x80,并判断。(但是系统调用那么多,这个比较难实现)。paper最后提到了,有人(Hsp)提出了吧int 0x80 的地址减少到1个并且存储在堆中,在内核中登记地址。应用程序中可以把int 0x80的地址放在GOT中,并把GOT设置为不可读不可写,防止攻击者搜索程序得到int 0x80的地址。(我觉得不靠谱,大家都得配合你这么干才行)
转载地址:http://eemli.baihongyu.com/