ret2syscall

ret2syscall

即控制程序执行系统调用,获取 shell,主要是指通过栈溢出来利用gadgets修改寄存器和变量的值

Gadgets

以 ret 结尾的指令序列,通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程。

ROP 攻击一般得满足如下条件

程序存在溢出,并且可以控制返回地址。 可以找到满足条件的 gadgets 以及相应 gadgets 的地址。 如果 gadgets 每次的地址是不固定的,那我们就需要想办法动态获取对应的地址了。

每一个gadgets都含有ret是为了能够使得程序自动持续的选择堆栈中的指令依次执行

ret指令可以理解成取栈顶的数据作为下次跳转的位置。即,

或者简单理解成: pop eip; (pop指令会附加esp的移动,意思是取栈顶的数据作为下次跳转的位置)然后执行 jump

相比之下,call指令即 :push eip;(此时eip为call指令的下一条指令的地址,意思是将call指令的下一条指令地址压入栈) 然后 jump

这里我们以pop eax ; ret为例,这段代码的作用就是将栈顶的数据弹出给eax,然后再将栈顶的数据作为返回地址返回。

假设栈上有三个参数,分别为aaaa,bbbb,cccc

覆盖eip为pop eax ; ret,并在aaaa、bbbb、cccc之间穿插pop ebx; ret和pop ecx;ret时会发生什么呢

从低址到高址,首先aaaa被放入eax中,执行ret,bbbb被放入ebx中,执行ret,cccc被放入ecx中

syscall