ROP系统攻击思想
0x00 题记
学习pwn时总是接触到Rop技术,看别人的writeup很是吃力,别人的文章中也只是简单的提了一下,但是具体什么是Rop,它的利用原理和思想是什么我都不得而知。现在我经过查找相关的资料后终于对其有了更深入的理解。ROP全称为Retrun-oriented Programmming(面向返回的编程)是一种新型的基于代码复用技术的攻击,攻击者从已有的库或可执行文件中提取指令片段,构建恶意代码。下面我们进行具体说明。
0x01 不得不提的return-to-libc
要学习Rop技术我们首先要了解一下return-to-libc,它是通过利用 已有代码 ,如libc库函数中的代码,实施攻击 。攻击者通过栈溢出,覆盖正常函数栈中的返回地址,使恶意调用的函数的参数覆盖栈中返回地址邻近区域的内存空间,然后函数调用返回时,会去执行libc中的攻击者制定的函数,如使用sys-tern(),执行shell。值得强调的是不但攻击者恶意调用和libc中的代码可以被使用,任何可执行的代码都有可能被攻击。return-to-libc技术虽然使得攻击者绕过了基于w o X等技术的防护措施 ,但是与基于代码注入的攻击相比,还是受很大限制。其一 ,在 retum-tc~libc中,被恶意调用的函数的执行顺序只能是线性的,不能使用分支或者跳转,而恶意注入代码并无此限制;其二 ,恶意调用的函数只能是程序的代码段或者加载的库中可用的函数 ,如果去掉某些危险 的库 函数 ,将很大程度上限制攻击者的攻击能力 。因而 ,w o X技术某种程度上也限制了攻击者的能力。在此 基础上提出了 Retum-OrientedProgramming(ROP)的 方法 。即通过使用已有的程序库,包括 libc、驱动程序等可执行的代码片段 ,构建图灵完备的程序,达到攻击程序的正常控制流程 、提升攻击者操作权限甚至完全获取计算机控制权的目的。ROP不同于 retum-to-libc攻击之处在于,R0P攻击利用以ret指令结尾的函数代码片段 ,而不是整个函数本身去完成预定的操作 。从 广义角度讲,return-to-libc攻击是 ROP攻击的特例 。
0x02 Rop思想
ROP的思想是攻击者扫描已有的动态链接库和可执行文件,提取出可以利用的指令片段(gadget) ,例如加法 运算 ,称之为gadget。这些指令片段均以ret指令结尾,即用ret指令实现指令片段执行流的衔接。操作系统通过栈来进行函数的调用和返回。函数的调用和返回就是通过压栈和出栈来实现的。每个程序都会维护一个程序运行栈,栈为所有函数共享,每次函数调用,系统会分配一个栈桢给当前被调用函数,用于参数的传递、局部变量的维护、返回地址的填入等。栈帧是程序运行栈的一部分 ,在Linux中 ,通过%esp和 %ebp寄存器维护栈顶指针和栈帧的起始地址 ,%eip是程序计数器寄存器[1] 。而ROP攻击则是利用以ret结尾的程序片段 ,操作这些栈相关寄存器,控制程的流程,执行相应的gadget,实施攻击者预设目标 。