原理

stack pivoting,正如它所描述的,该技巧就是劫持栈指针指向攻击者所能控制的内存处,然后再在相应的位置进行 ROP。一般来说,我们可能在以下情况需要使用 stack pivoting

此外,利用 stack pivoting 有以下几个要求

pop rsp/esp

当然,还会有一些其它的姿势。比如说 libc_csu_init 中的 gadgets,我们通过偏移就可以得到控制 rsp 指针。

还有更加高级的fake frame

栈迁移条件

简单来说就是可溢出的长度不够,比如溢出后只能覆盖ebp和ret或者只能覆盖ebp

  1. 要能够栈溢出,这点尤其重要,最起码也要溢出覆盖个ebp
  2. 你要有个可写的地方(就是你要GetShell的地方),先考虑bss段,最后再考虑写到栈中

栈迁移过程

在讲栈迁移过程前我们需要了解leave ret两条汇编指令

; push eip 进入前会压栈返回地址
Sub PROC
    enter 8,0
    .
    .
    .
    leave
    ret
Sub ENDP

等效

; push eip 进入前会压栈返回地址
Sub PROC
    push ebp
    mov ebp, esp
    sub esp, 8     ; enter
    .
    .
    .
    mov esp, ebp
    pop ebp        ; leave
    pop eip        ; ret
Sub ENDP