web-dev-qa-db-ja.com

リターン指向プログラミング:スタックピボットを見つける方法

ヒープオーバーフローのプログラムがあります。ランダム化されていない(ASLRを使用していない)コードが含まれています。リターン指向のプログラミングを利用したい。これはヒープオーバーフローなので、最初に行う必要があるのはスタックピボットを見つけることです。これにより、ROPプログラムが存在する既知のメモリアドレスを指すRSPを取得できます。

スタックピボットを見つけるための最先端の方法は何ですか?どの命令シーケンスを探すべきですか?スタックピボットとして使用できる命令シーケンスのリスト/データベースはありますか?

また、注意しなければならない防御/緩和策はありますか、それとも気づくのに役立ちますか?


たとえば、私はlongjmp()呼び出しがスタックピボット(たとえば、POP RSP ... RETシーケンス)を見つけるのに適した場所であることを覚えています。ただし、一部のプラットフォームではlongjmp()呼び出しの利用を困難にする緩和策が組み込まれているとのことで、暗号化された形式でsetjmpバッファーを格納しています。それは正しいですか、この緩和策を回避する方法はありますか、それともlongjmp() sをあきらめる必要がありますか?

もう1つの緩和策は、Windows 8のVirtualProtect関数が、RSPが適切な値に設定されて呼び出されていることを確認することです。ただし、 他の人はその緩和策を回避する方法を文書化しています なので、それは障壁ではありません-とにかく、それは最初のスタックピボットの防止に焦点を当てていません。この質問における私の焦点/関心は、初期のスタックピボットにあり、その後に行うことではありません。

16
D.W.

コレランのモナをご覧ください

https://www.corelan.be/index.php/2011/07/14/mona-py-the-manual/

3
airloom