WWW2Exec - __malloc_hook & __free_hook

HackTricksのサポート

Malloc Hook

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

Free Hook

これは、アンソートされたビン攻撃を悪用したページの例で悪用されました:

Unsorted Bin Attack

バイナリにシンボルが含まれている場合、次のコマンドを使用して __free_hook のアドレスを見つけることができます:

gef➤  p &__free_hook

投稿では、シンボルなしでfreeフックのアドレスを特定する手順がステップバイステップで説明されています。要約すると、free関数内で次のようになります:

gef➤  x/20i free
0xf75dedc0 <free>: push   ebx
0xf75dedc1 <free+1>: call   0xf768f625
0xf75dedc6 <free+6>: add    ebx,0x14323a
0xf75dedcc <free+12>:  sub    esp,0x8
0xf75dedcf <free+15>:  mov    eax,DWORD PTR [ebx-0x98]
0xf75dedd5 <free+21>:  mov    ecx,DWORD PTR [esp+0x10]
0xf75dedd9 <free+25>:  mov    eax,DWORD PTR [eax]--- ここで中断
0xf75deddb <free+27>:  test   eax,eax ;<
0xf75deddd <free+29>:  jne    0xf75dee50 <free+144>

前述のコード内の中断点で、$eaxfreeフックのアドレスが格納されます。

次に、ファストビンアタックが実行されます:

  • まず、__free_hook の場所でサイズが200のファストチャンクを扱うことが可能であることが判明します:

  • gef➤  p &__free_hook

$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が指す関数が実行されます。

参考文献

Last updated