Ret2Libc 攻击技术

1. DEP 技术对stack overflow 的保护:


Data Execution Prevention:  去掉 stack 上的执行权限,可以阻止一部分基于 stack 的攻击。


 2. Ret2Libc 攻击原理


 Return-to-library technique
      简称“Ret2Lib”,这种技术可以绕过DEP的保护,其核心思想是把返回地址直接指向系统某个已存在的函数(一般是system,因为其使用简单,参数只有一个),这样同样可以达到攻击的目的。再来看刚才的例子,如果在badfile构造一些数据,使其被bof函数读取后,达到如下堆栈分布:

Ret2Libc 攻击技术_第1张图片
        这样当程序执行完bof后,马上就跳转到system函数了,然后去获取其第一个函数,即&"/bin/sh",这样就让程序直接跑起了一个sh进程了。 试想一下,如果这个程序是一个具备suid的程序,那就意味着我们轻易就获得了root权限了。


3. Ret2Libc 的预防


  Borrowed Code Chunks
     "Ret2Lib"一直工作得很好,直接x64体系的出现。x64相比于x86,最后的区别是函数参数的传递不再完全依赖堆栈,其规定函数的第一个参数必须保存到第一个寄存器即EAX,这导致单纯的把参数地址放在堆栈并不能很好的工作,除非函数本身不需要参数。因此,在这种情况下,Borrowed Code Chunks技术就诞生了。这种技术是Ret2Lib技术的一个思维突破,它不再单纯把返回地址指向整个函数入口,而且还包括函数中任意的指令片断。还是回到刚才的DEMO,如果要实现先把&"/bin/sh"的地址赋值给EAX,那么我们可以尝试寻找下列指令:

POP %EAX
ret
或者
POP %EAX
POP %EBX
JMP %EBX
等等
      假如我们找到前者的指令,这样我们在badfile写入如下数据:[POP_address][&/bin/sh][system_address][fake_ebp][fake_retaddress],同样可以达到攻击目标。


4. 补充:


     Ret2libc 攻击除了使用 system() 函数以外,还会使用 exec(), mprotect() 函数。

    mprotect() 函数可以改变 页表的属性,从而使 DEP 攻击失效。



你可能感兴趣的:(security)