hacktricks/src/binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md

3.5 KiB
Raw Blame History

WWW2Exec - .dtors & .fini_array

{{#include ../../banners/hacktricks-training.md}}

.dtors

Caution

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

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

このセクションのアドレスを取得するには:

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

通常、DTOR マーカーは、値 ffffffff00000000 に見つかります。したがって、これらの値だけが見える場合、登録された関数はありません。したがって、00000000シェルコードアドレス上書き します。

Warning

もちろん、最初に シェルコードを格納する場所 を見つける必要があります。その後、呼び出すことができます。

.fini_array

基本的に、これはプログラムが終了する前に呼び出される 関数の構造 です。これは .dtors のように、アドレスにジャンプしてシェルコードを呼び出す ことができる場合や、再度 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回は任意書き込みのため、もう1回はスタック上の**__libc_csu_fini**の戻りアドレスを再度上書きするために自分自身を呼び出します。

Caution

Full RELROでは、セクション.fini_array読み取り専用になります。 新しいバージョンでは、[Partial RELRO]でもセクション**.fini_array読み取り専用**になります。

{{#include ../../banners/hacktricks-training.md}}