WWW2Exec - .dtors & .fini_array

HackTricksのサポート

.dtors

現在、.dtorsセクションを持つバイナリを見つけるのは非常に珍しいです!

デストラクタは、main関数が返る後に実行される関数です。 これらの関数のアドレスは、バイナリの**.dtorsセクションに格納されており、したがって、__DTOR_END__シェルコードのアドレスを書き込むことができれば、それはプログラムが終了する前に実行**されます。

このセクションのアドレスを取得するには、次のコマンドを使用します:

objdump -s -j .dtors /exec
rabin -s /exec | grep “__DTOR”

通常、DTOR マーカーは値 ffffffff00000000 の間にあります。したがって、これらの値だけを見ると、登録された関数がないことを意味します。そのため、00000000シェルコードのアドレス で上書きして、それを実行します。

もちろん、後でそれを呼び出すために シェルコードを保存する場所を見つける 必要があります。

.fini_array

基本的に、これはプログラムが終了する前に呼び出される関数のセットであり、.dtors のようなものです。これは、アドレスにジャンプしてシェルコードを呼び出すことができる場合や、脆弱性を2回目に悪用するために再び main に戻る必要がある場合に興味深いです。

objdump -s -j .fini_array ./greeting

./greeting:     file format elf32-i386

Contents of section .fini_array:
8049934 a0850408

#Put your address in 0x8049934

エターナルループ

.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 セクションは読み取り専用になります。

HackTricksのサポート

Last updated