stack pivotingとは
stack領域をheapなどの別の領域に移すこと。
モチベーション
stack based BoFの脆弱性が存在し、stack canaryが無効のときROPなどでstack内に大きな領域が必要な場合がある。
そのとき、さらにBoFできる量が限られてる場合の回避方法となる。
手法
以下、BoFによるリターンアドレスが任意に書き換え可能、PIE,stack canary無効、ASLR有効とする。
例えば以下のガジェットを組み合わせてできる。
pop eax; ret xchg esp, eax; ret
またstackを移すrwな別の領域がmallocなどで確保されている必要がある。
↑stack growth
+-+-+-+-+-+-+-+-
pop eax; ret
(return addr)
+-+-+-+-+-+-+-+-
allocated memory addr
+-+-+-+-+-+-+-+-
xchg esp,eax;ret
+-+-+-+-+-+-+-+-
上のような状態を考えればxchg実行後スタックポインターが別領域を指すように書き換えられるので、別領域からスタックの続きが始まるとわかる。