(コースプロジェクトの)リターン指向プログラミングを使用して利用しようとしているコードリポジトリで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の影響を受けないことを意味しますか?シェルを生成するために使用できる他の関数については知りません。
print 'system@plt'
の使用は、プログラムがsystem()を直接参照する既存の関数(呼び出されているかどうかにかかわらず)をすでに持っている場合にのみ有効です。あなたの例ではそうではありません。
まず、ライブラリのランダム化を無効にします(まだ行っていない場合)ulimit -s unlimited
GDB内
メインにブレークポイントを設定します
プログラムを実行します。
印刷システム
それはあなたにsystem()のアドレスを与えます
そこから、あなたが試みていたようなエクスプロイトを実行します。
また、ここに投稿する代わりに、TAや教授に尋ねることもできます。混乱している場合は、他の生徒も混乱している可能性があります。