hacktricks/binary-exploitation/libc-heap/house-of-einherjar.md

61 lines
5 KiB
Markdown
Raw Normal View History

# House of Einherjar
{% hint style="success" %}
AWSハッキングの学習と練習:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCPハッキングの学習と練習: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricksのサポート</summary>
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェック!
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォローする**。
* **HackTricks**と**HackTricks Cloud**のGitHubリポジトリにPRを提出してハッキングテクニックを共有する。
</details>
{% endhint %}
## 基本情報
### コード
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)から例を確認
* または[https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation](https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation)からtcacheを埋める必要があるかもしれません
### ゴール
* ほぼ任意の特定のアドレスにメモリを割り当てることが目標です。
### 必要条件
* チャンクを割り当てる際に偽のチャンクを作成する必要があります。
* ポインタを自身を指すように設定してセーフティチェックをバイパスします。
* 1バイトのオーバーフローを使用して、1つのチャンクから次のチャンクにヌルバイトを流し込み、`PREV_INUSE`フラグを変更します。
* オフバイヌルを悪用したチャンクの`prev_size`に、そのチャンクと偽のチャンクとの間の差を示します。
* 偽のチャンクのサイズもセーフティチェックをバイパスするために同じサイズに設定されている必要があります。
* これらのチャンクを構築するには、ヒープリークが必要です。
### 攻撃
* 攻撃者が制御するチャンク内に`A`偽のチャンクが作成され、`fd`と`bk`が元のチャンクを指すようにして保護をバイパスします。
* 他の2つのチャンク`B`と`C`)が割り当てられます。
* `B`のオフバイワンを悪用して、`prev in use`ビットがクリアされ、`prev_size`データが`C`チャンクが割り当てられた場所から前に生成された偽の`A`チャンクまでの差で上書きされます。
* この`prev_size`と偽のチャンク`A`のサイズは、チェックをバイパスするために同じである必要があります。
* 次に、tcacheを埋めます。
* 次に、`C`を解放して偽のチャンク`A`と統合します。
* 次に、偽の`A`チャンクから始まり、`B`チャンクをカバーする新しいチャンク`D`が作成されます。
* ここでEinherjarの家は終わります。
* これはファストビン攻撃またはTcacheポイソニングで続けることができます
* `B`を解放してファストビン/ Tcacheに追加します。
* `B`の`fd`を上書きして、`D`チャンクを悪用して目標アドレスを指すようにします(`B`が内部に含まれているため)。
* 次に、2つのmallocを行い、2番目のmallocが**目標アドレスを割り当てる**ことになります。
## 参考文献と他の例
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)
* **CTF** [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad)
* ポインタを解放した後、それらがヌル化されないため、データにアクセスできる可能性があります。したがって、未整列のビンにチャンクを配置し、それが含むポインタをリークさせlibcリーク、次に新しいヒープを未整列のビンに配置し、ポインタからヒープアドレスをリークさせます。
* [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/)
* `strtok`でのヌルバイトオーバーフローバグ。
* House of Einherjarを使用して重複するチャンクの状況を取得し、Tcacheポイソニングで任意の書き込み原始を取得します。