# オフバイワンオーバーフロー {% hint style="success" %} AWSハッキングの学習と練習:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ GCPハッキングの学習と練習: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) HackTricksのサポート * [**サブスクリプションプラン**](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を提出して、ハッキングトリックを共有してください。 {% endhint %} ## 基本情報 1バイトのオーバーフローへのアクセスだけで、攻撃者は次のチャンクの`size`フィールドを変更することができます。これにより、実際に解放されるチャンクを操作し、別の正当なチャンクを含むチャンクを生成する可能性があります。この攻撃手法は、[ダブルフリー](double-free.md)やオーバーラップするチャンクと類似しています。 オフバイワンの脆弱性には2種類あります: * 任意のバイト: この種類はそのバイトを任意の値で上書きできます * ヌルバイト (オフバイヌル): この種類はそのバイトを0x00でのみ上書きできます * この脆弱性の一般的な例は、次のコードで`strlen`と`strcpy`の挙動が一貫していないため、次のチャンクの先頭に0x00バイトを設定できることがあります。 * これは[House of Einherjar](house-of-einherjar.md)で悪用できます。 * Tcacheを使用している場合、これは[ダブルフリー](double-free.md)の状況に活用できます。 ```c // From https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/off_by_one/ int main(void) { char buffer[40]=""; void *chunk1; chunk1 = malloc(24); puts("Get Input"); gets(buffer); if(strlen(buffer)==24) { strcpy(chunk1,buffer); } return 0; } ``` ### 目的 * チャンクを別のチャンクの中に含まれるようにし、その2番目のチャンクへの書き込みアクセスを許可して含まれるものを上書きする ### 要件 * サイズメタデータ情報を変更するためのオフバイワンオーバーフロー ### 一般的なオフバイワン攻撃 * 3つのチャンク `A`、`B`、`C`(サイズ0x20とする)、およびトップチャンクとの統合を防ぐための別のチャンクを割り当てる * `C` を解放する(0x20 Tcache フリーリストに挿入) * チャンク `A` を使用して `B` にオーバーフローを発生させる。オフバイワンを悪用して `B` の `size` フィールドを0x21から0x41に変更する * これで `B` にはフリーチャンク `C` が含まれる * `B` を解放し、0x40のチャンクを割り当てる(ここに再配置される) * 依然としてフリーである `C` の `fd` ポインタを変更できる(Tcache 毒入れ) ### オフバイヌル攻撃 * 3つのメモリチャンク(a、b、c)が連続して予約される。その後、中央のチャンクが解放される。最初のチャンクにはオフバイワンオーバーフローの脆弱性があり、攻撃者はそれを0x00で悪用する(前のバイトが0x10であれば、中央のチャンクが実際よりも0x10小さいことを示す)。 * 次に、中央の解放されたチャンク(b)に2つのより小さいチャンク(b1、c)が割り当てられるが、`b + b->size` は c チャンクを更新しないため、指定されたアドレスは適切よりも小さい。 * 次に、b1 と c が解放される。`c - c->prev_size` はまだ b(現在は b1)を指しているため、両方が1つのチャンクに統合される。ただし、b2 はまだ b1 と c の間に存在する。 * 最後に、このメモリ領域を再利用するために新しい malloc が実行され、新しい malloc の所有者が b2 の内容を制御できるようになります。 この画像は攻撃を完璧に説明しています: https://heap-exploitation.dhavalkapil.com/attacks/shrinking_free_chunks * **[HackTricks](https://github.com/carlospolop/hacktricks)** および **[HackTricks Cloud](https://github.com/carlospolop/hacktricks-cloud)** のGitHubリポジトリにPRを送信してハッキングテクニックを共有してください。
https://heap-exploitation.dhavalkapil.com/attacks/shrinking_free_chunks