web-dev-qa-db-ja.com

実行可能ファイルでsystem()のアドレスを見つける方法-ROPエクスプロイト

(コースプロジェクトの)リターン指向プログラミングを使用して利用しようとしているコードリポジトリでsystem()のアドレスを見つけようとしています。コードには_stdlib.h_が含まれていますが、system()をどこでも使用していません。

_stdlib.h_のすべての関数は、明示的に使用されているかどうかに関係なく、実行可能ファイル(利用しようとしているもの)と同じアドレス空間にあるという印象を受けました。 gdbは私にこのエラーを与えます:

_(gdb) print 'system@plt'
No symbol "system@plt" in current context.
_

同様に、execve()もコンテキストにはありません。

_(gdb) print 'execve@plt'
No symbol "execve@plt" in current context.
_

これは、コードがROPの影響を受けないことを意味しますか?シェルを生成するために使用できる他の関数については知りません。

1
Nikhil

print 'system@plt'の使用は、プログラムがsystem()を直接参照する既存の関数(呼び出されているかどうかにかかわらず)をすでに持っている場合にのみ有効です。あなたの例ではそうではありません。

まず、ライブラリのランダム化を無効にします(まだ行っていない場合)ulimit -s unlimited

GDB内

  1. メインにブレークポイントを設定します

  2. プログラムを実行します。

  3. 印刷システム

それはあなたにsystem()のアドレスを与えます

そこから、あなたが試みていたようなエクスプロイトを実行します。

また、ここに投稿する代わりに、TAや教授に尋ねることもできます。混乱している場合は、他の生徒も混乱している可能性があります。

1
Daisetsu