一些关于内存缓冲区溢出的保护机制

时间:2022-12-06 12:18:51
     stack canaries 4位的随机数 “Canaries”探测,要监测对函数栈的破坏,需要修改函数栈的组织,在缓冲区和控制信息(如EBP等)间插入一个canaryword。这样,当缓冲区被溢出时,组返回地址被覆盖之前canaryword会首先被覆盖。通过检查canary word的值是否被修改,就可以判断是否发生了溢出攻击
terminator canaries 由于绝大多数的溢出漏洞都是由那些不做数据越界检查的C字符串处理函数引起的,而这些字符串都是以NULL作为终结字符的。选择NULL,CR(回车,ASCII 13,\r),LF(换行,ASCII 10,\n),这样的字符作为canary word就成了很自然的事情。例如,若canary word为0x000aff0d,为了使溢出不被监测,需要在溢出字符串中包含上述字符串并且要精确确定其地址,0x00会使strcpy()结束复制而防止返回地址被覆盖。 Random canaries 随机产生,不能被读取,但是副本最终会作为canary word被保存在函数中,攻击者任有可能通过函数获得canary word的值 Random XOR canaries 是由一个随机数和函数栈中的所有控制信息、返回地址通过异或的到的,那样函数栈中的canaries或者控制信息、返回覅之被修改就都能被检测到了。 DEP(Data execution Prevention)即为通常多说的NX(Non-eXecutable),让出了代码段之外其他地方的数据都不能执行,这在很大程序上防止了攻击者注入的恶意代码的执行,但其有以下几点缺陷:有些程序就是需要除了代码段的其他section的指令运行,如果用了该技术则会不兼容: return-oriented & return-to-libc攻击 ASLR ASLR(Address Space Layout Randomization)对一些object的地址做随机化,使得攻击者很难准确overflow正确的信息,但攻击者并非对此毫无办法: 1.可以猜测,或者用穷举的办法(JIT spraying 就是一个很好的例子) 2.可以运行一些代码来获得随机规律 3.有时候并不需要知道确切的地址,只要知道相对值就行了 SafeSEH 微软系统独特的Exception Handler机制的保护,叫Structured Exception Handler。简单说就是在每个函数提的栈上除了一些本地变量外还会存有一个叫做Exception Handler Record的东西。里面指向一个Exception Handler的链结构,当函数执行过程中如果发生Exception,则会从这个record开始查找对应的handler。如果攻击者在overflow时这个结构的handler的地址改成攻击代码的地址,则会在发生Exception时调用恶意代码。而SafeSEH用了两种方法SEh handler validation(维护一张表,在调用handler时检查是否是表中的合法handler)和SEH chain validation(enforce chain的一些特征使其在违反时能够被检查出来)。