WWW2Exec - __malloc_hook & __free_hook
Last updated
Last updated
AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングの学習と練習: HackTricks Training GCP Red Team Expert (GRTE)
GNU公式サイトによると、変数 __malloc_hook
は、malloc()
が呼び出されるたびに呼び出される関数のアドレスを指すポインタであり、libcライブラリのデータセクションに格納されています。したがって、このアドレスが例えば One Gadget で上書きされ、malloc
が呼び出されると、One Gadget が呼び出されます。
mallocを呼び出すには、プログラムがそれを呼び出すのを待つか、または printf("%10000$c")
を呼び出すことができます。これにより、libc
がそれらをヒープに割り当てるために多くのバイトを割り当てることができます。
One Gadgetに関する詳細情報は次のとおりです:
One Gadgetフックは GLIBC >= 2.34 では無効になっています。最新のGLIBCバージョンでは他のテクニックが使用できます。参照:https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md。
これは、アンソートされたビン攻撃を悪用したページの例で悪用されました:
Unsorted Bin Attackバイナリにシンボルが含まれている場合、次のコマンドを使用して __free_hook
のアドレスを見つけることができます:
投稿では、シンボルなしでfree
フックのアドレスを特定する手順がステップバイステップで説明されています。要約すると、free
関数内で次のようになります:
前述のコード内の中断点で、$eax
にfree
フックのアドレスが格納されます。
次に、ファストビンアタックが実行されます:
まず、__free_hook
の場所でサイズが200のファストチャンクを扱うことが可能であることが判明します:
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
この場所にサイズが0x200のファストチャンクを取得できれば、実行される関数ポインタを上書きすることが可能になります。
そのために、サイズ0xfc
の新しいチャンクが作成され、そのポインタでマージされた関数が2回呼び出され、この方法でサイズ0xfc*2 = 0x1f8
の解放されたチャンクへのポインタが取得されます。
次に、このチャンクでedit
関数が呼び出され、このファストビンの**fd
アドレスが以前の__free_hook
**関数を指すように変更されます。
次に、サイズが0x1f8
のチャンクが作成され、ファストビンから以前の無効なチャンクを取得し、**__free_hook
にファストビンチャンクを取得し、system
**関数のアドレスで上書きされます。
最後に、文字列/bin/sh\x00
を含むチャンクが削除関数を呼び出して解放され、**__free_hook
**関数がトリガーされ、/bin/sh\x00
をパラメータとして持つsystemが指す関数が実行されます。