Stack pivoting
ROP 可能需要很长空间放置长串 ROP Chain,有时并不会有那么多发挥空间,可能很短甚至只能控第一次rip(function pointer等),没有足够的空间放 ROP payload
若可以找到其他地方有足够空间放置 ROP payload,则可通过较少 gadget 来将 stack 搬至 ROP payload 的位置,再进行 ROP,即为 Stack pivoting(stack migration)
利用方式
leave;ret
- overflow 时将 rbp 填成 ROP Chain 的 address - 8
- retrun address 填 leave;ret gadget
pop rsp;ret
手动找针对各种当下情况的gadget
例子
足够放 ROP payload 的地址为 0x601090,真实ROP Chain开始的地址为 0x601098

把 rbp 盖成 gadget 地址0x601098 - 8 = 0x601090

即 0x601090,即将执行 leave;ret

Leave,即 mov rsp,rbp


pop rbp 后就会指到 ROP Chain - 8 的地方 0x601090

第一次正常 leave;ret,走到第一个 gadget

而此 gadget 又是 leave;ret

rsp 就指到 rbp 的地方

rbp 然后指到远处地址 0xdeadbeef

然后 ROP
