Return-oriented programming
Return-oriented programmingは様々なアーキテクチャ上で実行可能であるが、Shachamの論文および多くのフォローアップ研究はIntel x86アーキテクチャを対象としている。x86アーキテクチャは可変長のCISC命令セットであり、x86におけるReturn-oriented programmingでは、この命令セットが非常に密集している、つまり、あらゆるランダムなバイド列が何らかの正当なx86命令群として解釈される可能性が高いという事実を利用する。
つまり、制御フローを変更するオペコード(特にreturn命令 0xC3)を探索し、その前に存在する有用な命令群を探索するという手法が可能になる。これらの命令ガジェット群は、バッファオーバーフローエクスプロイト経由でreturnアドレスを最初のガジェットの先頭のアドレスに上書きし、以降のガジェットのアドレスをスタックに書き込むことでチェーンできる。
最初のガジェットの実行が終了すると、return命令が実行され、2番目のガジェットのアドレスがスタックからpopされ、そのアドレスにjumpする。そのガジェットの実行が終了すると、同様にチェーンは3番目のガジェットに移り、これが繰り返される。小さな命令群をチェーンすることで、攻撃者は既存のライブラリのコードから任意のプログラムの挙動を得ることができる。Shachamは、あらゆる十分に大きいコード(C標準ライブラリを含む)において、チューリング完全性を得るのに十分な量のガジェットが存在すると主張している。
ガジェットの探索とバイナリに対する攻撃の組み立てを支援する自動ツールも開発されている。例えば、ROPgadgetは、バイナリから有用な可能性のあるガジェットを探索し、shellをspawnして攻撃者からの任意の命令を受け取る攻撃用ペイロードの組み立てを試みる。