栈迁移¶
当栈溢出的空间不足以放下整个ROP链时,可以使用栈迁移,将栈空间迁移到更大的受控区域(如bss段)。
栈迁移的核心是利用leave; ret指令序列。leave指令相当于mov esp, ebp; pop ebp,作用是将ebp寄存器的值赋给esp寄存器,然后从栈中弹出一个值赋给ebp寄存器。这样,栈指针就被移动到了新的位置。
leave; ret指令原本的作用是在函数返回时恢复栈帧,但当攻击者额外控制了ebp寄存器的值时,可以利用它来实现栈迁移。攻击者可以将ebp设置为新的受控区域的地址,然后通过执行leave指令,从而改变esp寄存器的值,使其指向新的受控区域,进而影响到eip寄存器的值,实现对程序控制流的劫持。