エクスプロイトにおけるStack Pivotingについて

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実行後スタックポインターが別領域を指すように書き換えられるので、別領域からスタックの続きが始まるとわかる。