WWW2Exec - .dtors & .fini_array
Last updated
Last updated
AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングの学習と練習: HackTricks Training GCP Red Team Expert (GRTE)
現在、.dtorsセクションを持つバイナリを見つけるのは非常に珍しいです!
デストラクタは、main
関数が返る後に実行される関数です。
これらの関数のアドレスは、バイナリの**.dtors
セクションに格納されており、したがって、__DTOR_END__
にシェルコードのアドレスを書き込むことができれば、それはプログラムが終了する前に実行**されます。
このセクションのアドレスを取得するには、次のコマンドを使用します:
通常、DTOR マーカーは値 ffffffff
と 00000000
の間にあります。したがって、これらの値だけを見ると、登録された関数がないことを意味します。そのため、00000000
を シェルコードのアドレス で上書きして、それを実行します。
もちろん、後でそれを呼び出すために シェルコードを保存する場所を見つける 必要があります。
基本的に、これはプログラムが終了する前に呼び出される関数のセットであり、.dtors
のようなものです。これは、アドレスにジャンプしてシェルコードを呼び出すことができる場合や、脆弱性を2回目に悪用するために再び main
に戻る必要がある場合に興味深いです。
.fini_array
からの関数が実行されると、次の関数に移動するため、複数回実行されることはありません(永遠のループを防ぎます)。ただし、ここに配置された関数の実行は1回だけ行われます。
.fini_array
のエントリは逆順で呼び出されるため、おそらく最後のエントリから書き始めたいと思うでしょう。
.fini_array
を悪用してエターナルループを作成するには、ここで行われた内容を確認してください: .fini_array
に少なくとも2つのエントリがある場合、次のようにすることができます:
最初の書き込みを使用して、脆弱な任意の書き込み関数を再度呼び出す
次に、__libc_csu_fini
によって保存されたスタック内のリターンアドレスを計算し、そこに**__libc_csu_fini
** のアドレスを配置する
これにより、__libc_csu_fini
が自身を再度呼び出し、.fini_array
関数が再度実行され、脆弱なWWW関数が2回呼び出されます:任意の書き込み用に1回、そして**__libc_csu_fini
** のリターンアドレスを再度上書きして自身を再度呼び出すためのもう1回。
Full RELRO****を使用すると、.fini_array
セクションは読み取り専用になります。 新しいバージョンでは、[Partial RELRO] を使用しても、.fini_array
セクションは読み取り専用になります。
AWSハッキングの学習と実践:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングの学習と実践:HackTricks Training GCP Red Team Expert (GRTE)