WWW2Exec - __malloc_hook & __free_hook

Reading time: 6 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

Malloc Hook

公式GNUサイトにあるように、変数**__malloc_hookは、malloc()が呼び出されるたびに呼び出される関数のアドレスを指すポインタであり、libcライブラリのデータセクションに格納されています。したがって、このアドレスがOne Gadget**で上書きされ、mallocが呼び出されると、One Gadgetが呼び出されます

mallocを呼び出すには、プログラムがそれを呼び出すのを待つか、printf("%10000$c")を呼び出すことで、libcがヒープにそれらを割り当てるためにmallocを呼び出すように、非常に多くのバイトを割り当てることができます

One Gadgetに関する詳細は以下を参照してください:

One Gadget

warning

GLIBC >= 2.34ではフックが無効になっていることに注意してください。最新のGLIBCバージョンで使用できる他の技術があります。参照: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md

Free Hook

これは、未整列ビン攻撃を悪用した後にファストビン攻撃を悪用したページの例の1つで悪用されました:

Unsorted Bin Attack

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

bash
gef➤  p &__free_hook

この投稿では、シンボルなしでフリーフックのアドレスを特定する手順を説明しています。要約すると、free関数内で:

gef➤  x/20i free
0xf75dedc0 : push   ebx
0xf75dedc1 : call   0xf768f625
0xf75dedc6 : add    ebx,0x14323a
0xf75dedcc :  sub    esp,0x8
0xf75dedcf :  mov    eax,DWORD PTR [ebx-0x98]
0xf75dedd5 :  mov    ecx,DWORD PTR [esp+0x10]
0xf75dedd9 :  mov    eax,DWORD PTR [eax]--- ここでブレーク
0xf75deddb :  test   eax,eax ;<
0xf75deddd :  jne    0xf75dee50 

前述のコードのブレークポイントで、$eaxにはフリーフックのアドレスが格納されます。

次に、ファストビン攻撃が実行されます:

  • まず、__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の解放されたチャンクへのポインタを取得します。
  • 次に、このチャンクの編集関数を呼び出して、このファストビンの**fdアドレスを前の__free_hook**関数を指すように変更します。
  • その後、サイズ0x1f8のチャンクを作成して、ファストビンから前の無駄なチャンクを取得し、さらにサイズ0x1f8のチャンクを作成して、**__free_hook内のファストビンチャンクを取得し、system**関数のアドレスで上書きします。
  • 最後に、文字列/bin/sh\x00を含むチャンクを解放し、削除関数を呼び出すことで、**__free_hook**関数がトリガーされ、/bin/sh\x00をパラメータとしてsystemを指します。

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする