1. DEP 技术对stack overflow 的保护:
Data Execution Prevention: 去掉 stack 上的执行权限,可以阻止一部分基于 stack 的攻击。
2. Ret2Libc 攻击原理
Return-to-library technique
简称“Ret2Lib”,这种技术可以绕过DEP的保护,其核心思想是把返回地址直接指向系统某个已存在的函数(一般是system,因为其使用简单,参数只有一个),这样同样可以达到攻击的目的。再来看刚才的例子,如果在badfile构造一些数据,使其被bof函数读取后,达到如下堆栈分布:
3. Ret2Libc 的预防
Borrowed Code Chunks
"Ret2Lib"一直工作得很好,直接x64体系的出现。x64相比于x86,最后的区别是函数参数的传递不再完全依赖堆栈,其规定函数的第一个参数必须保存到第一个寄存器即EAX,这导致单纯的把参数地址放在堆栈并不能很好的工作,除非函数本身不需要参数。因此,在这种情况下,Borrowed Code Chunks技术就诞生了。这种技术是Ret2Lib技术的一个思维突破,它不再单纯把返回地址指向整个函数入口,而且还包括函数中任意的指令片断。还是回到刚才的DEMO,如果要实现先把&"/bin/sh"的地址赋值给EAX,那么我们可以尝试寻找下列指令:
4. 补充:
Ret2libc 攻击除了使用 system() 函数以外,还会使用 exec(), mprotect() 函数。
mprotect() 函数可以改变 页表的属性,从而使 DEP 攻击失效。