基础ROP
*目前主要的是 ROP(Return Oriented Programming)
,其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets)
来改变某些寄存器或者变量的值,从而控制程序的执行流程。所谓gadgets
就是以ret
结尾的指令序列,通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程
1.程序存在溢出,并且可以控制返回地址。
2 可以找到满足条件的 gadgets 以及相应 gadgets 的地址。
如果 gadgets 每次的地址是不固定的,那我们就需要想办法动态获取对应的地址了。
2.frame faking
正如这个技巧名字所说的那样,这个技巧就是构造一个虚假的栈帧来控制程序的执行流
原理:
概括地讲,我们在之前讲的栈溢出不外乎两种方式
控制程序 EIP
控制程序 EBP
其最终都是控制程序的执行流。在 frame faking 中,我们所利用的技巧便是同时控制 EBP 与 EIP,这样我们在控制程序执行流的同时,也改变程序栈帧的位置。
其实看完wiki里的这段话我有点似懂非懂的感觉
在创建栈帧是我们肯定要push一个ebp用来之后ret之前恢复环境,那么我们如果把我们想pop的ebp2覆盖了原先栈中保存的ebp,等pop ebp的时候,其实就变为了pop ebp2,以后执行别的函数的时候压入的ebp也变为了我们想要的ebp2了,再修改eip,执行到ebp2处,就控制了流程
那么显然在 fake frame 中,我们有一个需求就是,我们必须得有一块可以写的内存,并且我们还知道这块内存的地址,这一点与 stack pivoting 相似