基本原理
在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。
gadgets 通常是以 ret
结尾的指令序列,通过这样的指令序列,我们可以多次劫持程序控制流,从而运行特定的指令序列,以完成攻击的目的。
ret2text
即控制程序执行.text段的代码(程序自身代码)。有时候我们会使其连续执行几处不相邻的gadgets,这就是ROP。
ret
会栈上取出返回地址到ip寄存器,ip寄存器是指令寄存器,里面是指令地址
我们要做的就是将程序中栈上原本正常的指令地址劫持为恶意地址。举个例子:
+-----------------+ +-----------------+
| ret addr | | fake ret |
+-----------------+ +-----------------+
| saved bp | | saved bp |
+-----------------+<---bp +-----------------+<---bp
| | | |
| | | |
| | | |
+-----------------+<---sp +-----------------+<---sp
在我们实际利用过程中,只要先确定溢出长度,然后将ret addr覆写为恶意地址就行了
由高地址向低地址增长的栈
栈结构是自顶向下增长的,这里的顶指高地址,从上图的例子也能看出来,栈顶在低地址处,栈底在高地址处。当需要开辟新的栈空间的时候,栈顶会向更低地址移动。
利用手法
暂无