ret2syscall
ROP原理:
随着 NX 保护的开启,以往直接向栈或者堆上直接注入代码的方式难以继续发挥效果。攻击者们也提出来相应的方法来绕过保护,目前主要的是 ROP(Return Oriented Programming),其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。
gadget:
所谓 gadgets 就是以 ret 结尾的指令序列,通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程。
例如:pop eax ; ret
这段代码的作用就是将栈顶的数据弹出给eax,然后再将栈顶的数据作为返回地址返回。
假如我们通过栈溢出将eip覆盖为pop eax的地址,当程序返回的时候就会执行pop eax,将’aaaa’放到eax中,然后执行ret指令,将’bbbb’放入eip寄存器中,然后会执行地址为’bbbb’处的指令,可以看到,bbbb处的指令为xxxx,当执行完xxxx后,继续执行ret指令,然后会返回到cccc指令处,执行xxxx。system函数的本质也是一条条汇编指令的组合,如果我们能找到多个xxxx,ret结构的指令,将其连接在一起,就可以达到执行system函数的效果。