web-dev-qa-db-ja.com

return-to-printf @ pltを使用してGOTエントリをリークする

非パイとしてコンパイルされた小さなバイナリがありますが、ASLRが有効になっているため、共有ライブラリがランダム化されます。私の計画は、pltに戻ることでGOTからlibcアドレスをリークすることでしたが、私が持っている唯一の有用なplt-stubはprintfです。以前、私はputsを使用できるときにこの方法で実用的なエクスプロイトを記述しましたが、この場合、printf @ pltに戻った後に取得する唯一の出力は空の文字列です。

これまでのところ、この動作の理由を見つけることができませんでした。なぜprintfはこのように動作するのですか?この方法でアドレスをリークすることは可能ですか?

2
awerv

はい、printfを使用してアドレスをリークすることは可能だと思います。 putsでは、関数に1つの引数、stdoutに書き込む文字列、およびバッファーオーバーフローの場合はリークする関数のアドレスを渡すだけで済みます。 printfでは、フォーマット指定子も渡す必要があります。正確にそれを示す write-up here があります。

1
game0ver