# Tcache Bin Attack
ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert) HackTricksをサポートする他の方法: * **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい場合**は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください! * [**公式PEASS&HackTricksグッズ**](https://peass.creator-spring.com)を入手する * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見る * **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter**で**フォロー**する 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**。** * **ハッキングトリックを共有するには、** [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。
## 基本情報 Tcache binとは何かについての詳細は、このページをチェックしてください: {% content-ref url="bins-and-memory-allocations.md" %} [bins-and-memory-allocations.md](bins-and-memory-allocations.md) {% endcontent-ref %} まず最初に、Tcacheはglibcバージョン2.26で導入されました。 [**guyinatuxidoページ**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html)で提案されている**Tcache**攻撃は、次のチャンク内のbin内の次のチャンクへのポインタを任意のアドレスに上書きして、後でその特定のアドレスを割り当ててポインタを上書きすることが可能になるようにすることを目的としています。 ただし、現在では、上記のコードを実行するとエラーが発生します:**`malloc(): unaligned tcache chunk detected`**。そのため、新しいポインタにアラインされたアドレスを書き込む必要があります(または、書き込まれるアドレスが実際にアラインされていることを確認するためにバイナリを十分な回数実行する必要があります)。 ### Tcacheインデックス攻撃 通常、ヒープの先頭には、Tcache内の**各インデックスごとのチャンクの数**を含むチャンクと、**各Tcacheインデックスのヘッドチャンクへのアドレス**が含まれています。何らかの理由でこの情報を変更できる場合、**特定のアドレス(たとえばmallocフック)を指すようにいくつかのインデックスのヘッドチャンクを作成**することが可能になります。その後、そのインデックスのサイズのチャンクを割り当て、この場合はmallocフックの内容を上書きすることが可能になります。 ## 例 * CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html) * **Libc情報リーク**: Tcacheを埋め、チャンクをアンソートリストに追加し、Tcacheを空にして、**アンソートされたbinからチャンクを再割り当て**し、最初の8Bだけを上書きして、**チャンクの2番目のアドレスをそのままにして読み取ることができる**。 * **Tcache攻撃**: バイナリには1Bのヒープオーバーフローがあります。これを悪用して、割り当てられたチャンクの**サイズヘッダー**を変更して大きくします。その後、このチャンクを**解放**し、偽のサイズのチャンクのTcacheに追加します。その後、偽のサイズでチャンクを割り当て、前のチャンクが実際にはより小さいことを知っているため、これにより**メモリ内の次のチャンクを上書きする機会**が得られます。\ これを悪用して、次のチャンクのFDポインタを**`malloc_hook`**を指すように**上書き**し、その後、2つのポインタを割り当てることが可能になります:まず、変更した正当なポインタ、そして次に`malloc_hook`にあるチャンクが返され、**ワンガジェット**を書き込むことが可能になります。 * CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html) * **Libc情報リーク**: 使用後に解放されたメモリと二重解放があります。この解説では、小さなbinに配置されたチャンクのアドレスを読み取ることで、libcのアドレスを漏洩させました(アンソートされたbinからではなく、小さなbinから漏洩させました)。 * **Tcache攻撃**: **二重解放**を介してTcacheが実行されます。同じチャンクが2回解放されるため、Tcache内ではチャンクが自分自身を指すようになります。その後、割り当てられ、そのFDポインタが**free hook**を指すように変更され、再度割り当てられるため、リスト内の次のチャンクはfree hookになります。その後、これも割り当てられ、`system`のアドレスをここに書き込むことが可能になります。そのため、`"/bin/sh"`を含むmallocが解放されるとシェルが取得できます。 * CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html) * ここでの主な脆弱性は、オフセットを指定してヒープ内の任意のアドレスを`free`できることです * **Tcacheインデックス攻撃**: Tcacheチャンク(Tcache binの情報を含むチャンク)に格納されるサイズのチャンクを割り当てて解放すると、値が0x100のアドレスが生成されます。これは、Tcacheが各bin内のチャンクの数を異なるバイトで格納するためです。したがって、特定のインデックスの1つのチャンクが値0x100を生成します。 * その後、この値はサイズ0x100のチャンクがあるかのように見えます。これにより、このアドレスを`free`することが可能になります。これにより、そのアドレスがTcache内のサイズ0x100のチャンクのインデックスに追加されます。 * その後、サイズが**0x100**のチャンクを**割り当て**すると、前のアドレスがチャンクとして返され、他のTcacheインデックスを上書きすることが可能になります。\ たとえば、その中のmallocフックのアドレスを入れ、そのインデックスのサイズのチャンクを割り当てると、callocフック内のチャンクが返され、ワンガジェットを書き込むことが可能になります。 * CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html) * 以前と同じ脆弱性がありますが、1つの追加の制限があります * **Tcacheインデックス攻撃**: 前の攻撃と似た攻撃ですが、**Tcache情報を含むチャンクを解放**して、そのアドレスがそのサイズのTcacheインデックスに追加されるようにすることで、ステップ数を減らして攻撃を行います。そのサイズを割り当てて、Tcacheチャンク情報をチャンクとして取得し、その情報を使用して、free hookを1つのインデックスのアドレスとして追加し、それを割り当て、その上にワンガジェットを書き込むことが可能になります。