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
のように、シェルコードをアドレスにジャンプして呼び出す ことができる場合や、再度 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回は任意書き込みのため、もう1回はスタック上の**__libc_csu_fini
**の戻りアドレスを再度上書きするために自分自身を呼び出すためです。
Full RELROでは、セクション.fini_array
は読み取り専用になります。 新しいバージョンでは、[Partial RELRO]でも、セクション**.fini_array
は読み取り専用**になります。
AWSハッキングを学び、練習する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、練習する:HackTricks Training GCP Red Team Expert (GRTE)