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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Malloc Hook
公式GNUサイトにあるように、変数**__malloc_hook
は、malloc()
が呼び出されるたびに呼び出される関数のアドレスを指すポインタであり、libcライブラリのデータセクションに格納されています。したがって、このアドレスがOne Gadget**で上書きされ、malloc
が呼び出されると、One Gadgetが呼び出されます。
mallocを呼び出すには、プログラムがそれを呼び出すのを待つか、printf("%10000$c")
を呼び出すことで、libcがヒープにそれらを割り当てるためにmallocを呼び出すように、非常に多くのバイトを割り当てることができます。
One Gadgetに関する詳細は以下を参照してください:
warning
GLIBC >= 2.34ではフックが無効になっていることに注意してください。最新のGLIBCバージョンで使用できる他の技術があります。参照: https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md。
Free Hook
これは、未整列ビン攻撃を悪用した後にファストビン攻撃を悪用したページの例の1つで悪用されました:
バイナリにシンボルがある場合、次のコマンドで__free_hook
のアドレスを見つけることができます:
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を指します。
参考文献
- https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook
- https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md.
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。