mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
138 lines
6.5 KiB
Markdown
138 lines
6.5 KiB
Markdown
# ダブルフリー
|
||
|
||
<details>
|
||
|
||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>を通じてゼロからヒーローまでAWSハッキングを学ぶ</strong></a><strong>!</strong></summary>
|
||
|
||
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を提出する
|
||
|
||
</details>
|
||
|
||
## 基本情報
|
||
|
||
メモリブロックを複数回解放すると、割り当て器のデータが狂い、攻撃の隙間が生まれる可能性があります。こうなる理由は次のとおりです:メモリブロックを解放すると、それは空きチャンクのリスト(例:「fastbin」)に戻ります。同じブロックを2回連続で解放すると、割り当て器はこれを検出してエラーをスローします。しかし、**その間に別のチャンクを解放すると、ダブルフリーチェックがバイパス**され、破損が発生します。
|
||
|
||
そして、新しいメモリを要求すると(`malloc`を使用)、割り当て器は**2回解放されたブロック**を提供する可能性があります。これにより、異なる2つのポインタが同じメモリ位置を指すことがあります。攻撃者がそのうちの1つのポインタを制御している場合、そのメモリの内容を変更でき、セキュリティの問題を引き起こすか、コードの実行を許可する可能性があります。
|
||
|
||
例:
|
||
```c
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
|
||
int main() {
|
||
// Allocate memory for three chunks
|
||
char *a = (char *)malloc(10);
|
||
char *b = (char *)malloc(10);
|
||
char *c = (char *)malloc(10);
|
||
char *d = (char *)malloc(10);
|
||
char *e = (char *)malloc(10);
|
||
char *f = (char *)malloc(10);
|
||
char *g = (char *)malloc(10);
|
||
char *h = (char *)malloc(10);
|
||
char *i = (char *)malloc(10);
|
||
|
||
// Print initial memory addresses
|
||
printf("Initial allocations:\n");
|
||
printf("a: %p\n", (void *)a);
|
||
printf("b: %p\n", (void *)b);
|
||
printf("c: %p\n", (void *)c);
|
||
printf("d: %p\n", (void *)d);
|
||
printf("e: %p\n", (void *)e);
|
||
printf("f: %p\n", (void *)f);
|
||
printf("g: %p\n", (void *)g);
|
||
printf("h: %p\n", (void *)h);
|
||
printf("i: %p\n", (void *)i);
|
||
|
||
// Fill tcache
|
||
free(a);
|
||
free(b);
|
||
free(c);
|
||
free(d);
|
||
free(e);
|
||
free(f);
|
||
free(g);
|
||
|
||
// Introduce double-free vulnerability in fast bin
|
||
free(h);
|
||
free(i);
|
||
free(h);
|
||
|
||
|
||
// Reallocate memory and print the addresses
|
||
char *a1 = (char *)malloc(10);
|
||
char *b1 = (char *)malloc(10);
|
||
char *c1 = (char *)malloc(10);
|
||
char *d1 = (char *)malloc(10);
|
||
char *e1 = (char *)malloc(10);
|
||
char *f1 = (char *)malloc(10);
|
||
char *g1 = (char *)malloc(10);
|
||
char *h1 = (char *)malloc(10);
|
||
char *i1 = (char *)malloc(10);
|
||
char *i2 = (char *)malloc(10);
|
||
|
||
// Print initial memory addresses
|
||
printf("After reallocations:\n");
|
||
printf("a1: %p\n", (void *)a1);
|
||
printf("b1: %p\n", (void *)b1);
|
||
printf("c1: %p\n", (void *)c1);
|
||
printf("d1: %p\n", (void *)d1);
|
||
printf("e1: %p\n", (void *)e1);
|
||
printf("f1: %p\n", (void *)f1);
|
||
printf("g1: %p\n", (void *)g1);
|
||
printf("h1: %p\n", (void *)h1);
|
||
printf("i1: %p\n", (void *)i1);
|
||
printf("i2: %p\n", (void *)i1);
|
||
|
||
return 0;
|
||
}
|
||
```
|
||
この例では、tcacheを複数の解放されたチャンクで埋めた後、コードは**チャンク`h`、次にチャンク`i`、そして再び`h`を解放**し、ダブルフリーエラーを引き起こします。これにより、再割り当て時に重複するメモリアドレスを受け取る可能性が開かれ、つまり2つ以上のポインタが同じメモリ位置を指すことができます。1つのポインタを介してデータを操作することで、他方に影響を与える可能性があり、重大なセキュリティリスクと悪用の可能性が生じます。
|
||
|
||
実行すると、**`i1`と`i2`が同じアドレスを取得した**ことに注意してください:
|
||
|
||
<pre><code>初期割り当て:
|
||
a: 0xaaab0f0c22a0
|
||
b: 0xaaab0f0c22c0
|
||
c: 0xaaab0f0c22e0
|
||
d: 0xaaab0f0c2300
|
||
e: 0xaaab0f0c2320
|
||
f: 0xaaab0f0c2340
|
||
g: 0xaaab0f0c2360
|
||
h: 0xaaab0f0c2380
|
||
i: 0xaaab0f0c23a0
|
||
再割り当て後:
|
||
a1: 0xaaab0f0c2360
|
||
b1: 0xaaab0f0c2340
|
||
c1: 0xaaab0f0c2320
|
||
d1: 0xaaab0f0c2300
|
||
e1: 0xaaab0f0c22e0
|
||
f1: 0xaaab0f0c22c0
|
||
g1: 0xaaab0f0c22a0
|
||
h1: 0xaaab0f0c2380
|
||
<strong>i1: 0xaaab0f0c23a0
|
||
</strong><strong>i2: 0xaaab0f0c23a0
|
||
</strong></code></pre>
|
||
|
||
## 参考文献
|
||
|
||
* [https://heap-exploitation.dhavalkapil.com/attacks/double\_free](https://heap-exploitation.dhavalkapil.com/attacks/double\_free)
|
||
|
||
<details>
|
||
|
||
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
||
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**および**HackTricks Cloud**のgithubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||
|
||
</details>
|