Translated ['binary-exploitation/heap/fast-bin-attack.md', 'binary-explo

This commit is contained in:
Translator 2024-06-16 08:46:17 +00:00
parent 4dcff73fd8
commit 1a0b76f27d
3 changed files with 107 additions and 68 deletions

View file

@ -2,15 +2,15 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)</strong>을 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong></summary>
다른 HackTricks 지원 방법:
다른 HackTricks 지원하는 방법:
- **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](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)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**팔로우**하세요.
- **HackTricks****HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](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) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**팔로우**하세요.
* **HackTricks****HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
</details>
@ -22,7 +22,7 @@
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
{% endcontent-ref %}
빠른 바인은 단일 링크이므로 다른 바인보다 보호 기능이 훨씬 적습니다. 그리고 **해제된 빠른 바인 청크의 주소를 수정**하는 것만으로도 **이후에 어떤 메모리 주소에서든 청크를 할당**할 수 있습니다.
빠른 바인은 단일 링크이므로 다른 바인보다 보호 기능이 훨씬 적습니다. 그리고 **해제된 빠른 바인 청크의 주소를 수정하는 것만으로도 이후에 임의의 메모리 주소에 청크를 할당**할 수 있습니다.
요약하면:
@ -44,7 +44,7 @@ ptr3 = malloc(0x20); // This will get a chunk in the <address> which could be ab
```
{% endcode %}
매우 잘 설명된 코드에서 완전한 예제를 찾을 수 있습니다. [https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html](https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html):
상세히 설명된 코드에서 완전한 예제를 찾을 수 있습니다. [https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html](https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html):
```c
#include <stdio.h>
#include <string.h>
@ -141,15 +141,19 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html)**:**
* 청크를 할당하고 해제한 다음, 그 내용을 읽고 채울 수 있습니다 (오버플로우 취약점을 이용).
* **정보 누출을 위한 청크 통합**: 오버플로우를 악용하여 가짜 prev\_size를 생성하여 이전 청크를 더 큰 청크 안에 넣어, 더 큰 청크를 할당할 때 다른 청크를 포함하는 것이 가능며, 그 데이터를 인쇄하고 libc(main\_arena+88) 주소를 누출할 수 있습니다.
* **malloc 후크 덮어쓰기**: 이를 위해 이전에 겹치는 상황을 악용하여 같은 메모리를 가리키는 2개의 청크를 가질 수 있었습니다. 따라서 두 청크를 모두 해제한 후 (보호 기능을 피하기 위해 중간에 다른 청크를 해제), 같은 청크를 fast bin에 2번 넣을 수 있었습니다. 그런 다음, 다시 할당하여 다음 청크의 주소를 malloc\_hook 앞쪽을 가리키도록 덮어쓰고 (malloc이 무료 크기로 생각하는 정수를 가리키도록 하여 다른 우회), 다시 할당하고 malloc 후크 주소를 받을 다른 청크를 할당할 수 있습니다.\
* **정보 누출을 위한 청크 통합**: 오버플로우를 악용하여 가짜 prev\_size를 생성하여 이전 청크를 더 큰 청크 안에 넣어, 더 큰 청크를 할당할 때 다른 청크를 포함하는 것이 가능해지며, 그 데이터를 인쇄하고 libc(main\_arena+88) 주소를 누출할 수 있습니다.
* **malloc 후크 덮어쓰기**: 이를 위해 이전에 겹치는 상황을 악용하여 메모리를 가리키는 2개의 청크를 가지고 있었습니다. 따라서 두 청크를 모두 해제하면 (보호를 피하기 위해 중간에 다른 청크를 해제), 같은 청크를 fast bin에 2번 넣을 수 있었습니다. 그런 다음, 다시 할당하여 다음 청크를 malloc\_hook 앞쪽을 가리키도록 덮어쓰고 (malloc이 무료 크기로 생각하는 정수를 가리키도록 하여 다른 우회), 다시 할당하고 malloc 후크 주소를 받을 다른 청크를 할당할 수 있습니다.\
마지막으로 **원 가젯**이 거기에 작성되었습니다.
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html)**:**
* 힙 오버플로우와 사용 후 해제, 그리고 더블 해제가 있습니다. 청크가 해제되면 재사용하고 포인터를 다시 해제할 수 있습니다.
* **Libc 정보 누출**: 일부 청크를 해제하면 메인 아레나 위치의 일부를 가리키는 포인터를 얻을 수 있습니다. 해제된 포인터를 재사용할 수 있기 때문에 이 주소를 읽을 수 있습니다.
* **Fast bin 공격**: 할당된 모든 포인터는 배열 안에 저장되므로 몇 개의 fast bin 청크를 해제하고 마지막 청크에서 이 포인터 배열 앞쪽을 가리키도록 주소를 덮어쓸 수 있습니다. 그런 다음, 동일한 크기의 몇 개의 청크를 할당하면 먼저 정품 청크를 얻은 다음 포인터 배열을 포함하는 가짜 청크를 얻을 수 있습니다. 이제 이 할당 포인터를 `free`의 got 주소를 가리키도록 덮어쓸 수 있고, 그런 다음 청크 1 `"/bin/sh"`를 쓴 후 `free(chunk1)`을 실행하여 `system("/bin/sh")`를 실행할 수 있습니다.
* 정렬되지 않은 bin 공격을 통해 남용된 Fast Bin 공격을 찾을 수 있습니다.
* 참고&#x20;
* 힙 오버플로우와 사용 후 무료 및 이중 해제가 있습니다. 청크가 해제되면 포인터를 재사용하고 다시 해제할 수 있습니다.
* **Libc 정보 누출**: 일부 청크를 해제하면 메인 아레나 위치의 일부를 가리키는 포인터를 얻을 수 있습니다. 해제된 포인터를 재사용할 수 있으므로 이 주소를 읽을 수 있습니다.
* **Fast bin 공격**: 할당된 모든 포인터는 배열 안에 저장되므로 몇 개의 fast bin 청크를 해제하고 마지막 청크에서 이 포인터 배열 앞쪽을 가리키도록 주소를 덮어쓸 수 있습니다. 그런 다음, 동일한 크기의 몇 개의 청크를 할당하면 먼저 정품 청크를 얻은 다음 포인터 배열을 포함하는 가짜 청크를 얻을 수 있습니다. 이제 이 할당 포인터를 `free`의 got 주소를 가리키도록 덮어쓸 수 있어 system으로 가리키도록 하고 청크 1 `"/bin/sh"`를 쓴 다음 `free(chunk1)`을 실행하여 `system("/bin/sh")`를 실행할 수 있습니다.
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
* 정렬되지 않은 bin에서 1바이트 오버플로우를 악용하여 청크를 통합하고 libc 정보 누출을 얻은 다음 malloc 후크를 원 가젯 주소로 덮어쓰기 위한 fast bin 공격을 수행하는 또 다른 예시
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html)
* 정렬되지 않은 bin을 악용하여 정보 누출을 위한 UAF를 남용하여 libc 주소와 PIE 주소를 누출한 후, 이 CTF의 exploit은 fast bin 공격을 사용하여 제어된 청크가 위치한 곳에 청크를 할당하여 특정 포인터를 덮어쓰고 GOT에 원 가젯을 작성할 수 있었습니다.
* 정렬되지 않은 bin 공격을 통해 악용된 Fast Bin 공격을 찾을 수 있습니다:
* fast bin 공격을 수행하기 전에 필요한 경우 libc/힙 주소를 누출하기 위해 unliked list를 악용하는 것이 일반적임을 유의하십시오.
{% content-ref url="unsorted-bin-attack.md" %}
[unsorted-bin-attack.md](unsorted-bin-attack.md)
@ -157,7 +161,7 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배우세요!</summary>
<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를 지원하는 다른 방법:
@ -165,6 +169,6 @@ HackTricks를 지원하는 다른 방법:
* [**공식 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) 컬렉션
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **HackTricks****HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
</details>

View file

@ -2,15 +2,15 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요!</strong></summary>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong></summary>
HackTricks를 지원하는 다른 방법:
다른 방법으로 HackTricks를 지원하는 방법:
- **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](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) 컬렉션입니다.
- **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](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) 또는 [**텔레그램 그룹**](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을 제출하세요.
- **HackTricks****HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
</details>
@ -89,39 +89,39 @@ return 0;
```
</details>
* **공격은 tcaches가 사용되는 경우 작동하지 않습니다 (2.26 이후)**
* 공격은 tcaches가 사용되면 작동하지 않습니다 (2.26 이후)
### 목표
이 공격은 **chunk를 가리키는 포인터를 자신의 3 주소 앞으로 변경**하는 것을 가능하게 합니다. 이 새로운 위치(포인터가 위치한 주변)에 흥미로운 내용이 있으면(다른 제어 가능한 할당/스택 등), 그것들을 읽거나 덮어쓰기하여 더 큰 피해를 줄 수 있습니다.
이 공격은 **덩어리를 가리키는 포인터를 자신의 3 주소 앞으로 변경**할 수 있게 합니다. 이 새로운 위치(포인터가 위치한 주변)에 흥미로운 내용(다른 제어 가능한 할당/스택 등)이 있다면, 그것들을 읽거나 덮어쓰기하여 더 큰 피해를 줄 수 있습니다.
* 만약 이 포인터가 스택에 위치다면, 이제 3 주소 앞을 가리키고 있기 때문에 사용자가 읽고 수정할 수 있으므로, 스택에서 민감한 정보를 유출하거나 심지어 canary를 건드리지 않고 반환 주소를 수정할 수 있을 것입니다.
* CTF 예시에서, 이 포인터는 다른 할당에 대한 포인터 배열에 위치해 있으므로, 3 주소 앞을 가리키도록 만들어 다른 주소로 포인팅할 수 있습니다.\
사용자가 다른 할당도 읽고 쓸 수 있기 때문에 정보를 유출하거나 임의의 위치(예: GOT)에 새 주소를 덮어쓸 수 있습니다.
* 만약 이 포인터가 스택에 위치다면, 이제 3 주소 앞을 가리키고 있기 때문에 사용자가 읽고 수정할 수 있으므로, 스택에서 민감한 정보를 유출하거나 심지어 canary를 건드리지 않고 반환 주소를 수정할 수 있을 것입니다.
* CTF 예시에서, 이 포인터는 다른 할당에 대한 포인터 배열에 위치해 있으므로, 3 주소 앞을 가리키도록 만들고 읽고 쓸 수 있게 되면, 다른 포인터들을 다른 주소를 가리키도록 만들 수 있습니다.\
사용자가 다른 할당도 읽고 쓸 수 있기 때문에, 정보를 유출하거나 임의의 위치(예: GOT)에 새로운 주소를 덮어쓸 수 있습니다.
### 요구 사항
* 일부 메모리(예: 스택)에서 제어를 얻어 일부 속성에 값을 제공하여 가짜 청크를 만들 수 있어야 합니다.
* 가짜 청크의 포인터를 설정하기 위해 스택 유출이 필요합니다.
* 메모리(예: 스택)에서 일부 제어를 얻어 일부 속성에 값을 제공하여 몇 개의 덩어리를 만들 수 있어야 합니다.
* 가짜 덩어리의 포인터를 설정하기 위해 스택 유출이 필요합니다.
### 공격
* 두 개의 청크가 있습니다 (chunk1 및 chunk2)
* 두 개의 덩어리가 있습니다 (chunk1 및 chunk2)
* 공격자는 chunk1의 내용과 chunk2의 헤더를 제어합니다.
* chunk1에서 공격자는 가짜 청크의 구조를 만듭니다:
* chunk1에서 공격자는 가짜 덩어리의 구조를 만듭니다:
* 보호 기능을 우회하기 위해 `size` 필드가 올바른지 확인하여 `corrupted size vs. prev_size while consolidating` 오류를 피합니다.
* 그리고 가짜 청크`fd``bk` 필드가 chunk1 포인터가 저장된 위치를 가리키도록 만들어줍니다. 각각 -3 및 -2의 오프셋으로, 따라서 `fake_chunk->fd->bk``fake_chunk->bk->fd`가 실제 chunk1 주소가 위치한 메모리(스택) 위치를 가리킵니다:
* 그리고 가짜 덩어리`fd``bk` 필드가 chunk1 포인터가 저장된 위치를 가리키도록 만들어야 합니다. 이때 오프셋은 각각 -3 및 -2이므로 `fake_chunk->fd->bk``fake_chunk->bk->fd`가 실제 chunk1 주소가 있는 메모리(스택) 위치를 가리키게 됩니다:
<figure><img src="../../.gitbook/assets/image (1245).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
* chunk2의 헤더는 수정되어 이전 청크가 사용되지 않았음을 나타내고, 크기가 포함된 가짜 청크의 크기임을 나타냅니다.
* 두 번째 청크가 해제되면 이 가짜 청크가 연결 해제됩니다:
* chunk2의 헤더는 수정되어 이전 덩어리가 사용되지 않았음을 나타내고 가짜 덩어리의 크기가 포함된 크기임을 나타냅니다.
* 두 번째 덩어리가 해제되면 이 가짜 덩어리가 연결 해제됩니다:
* `fake_chunk->fd->bk` = `fake_chunk->bk`
* `fake_chunk->bk->fd` = `fake_chunk->fd`
* 이전에 `fake_chunk->fd->bk``fake_chunk->fd->bk`가 동일한 위치(스택에 chunk1이 저장된 위치)를 가리키도록 만들어졌으므로(유효한 연결된 목록이었습니다). **두 개가 동일한 위치를 가리키고 있기 때문에** 마지막 것만(`fake_chunk->bk->fd = fake_chunk->fd`) **적용**됩니다.
* 이것은 **스택에 있는 chunk1의 포인터를 스택에서 3 주소 앞에 저장된 주소(또는 바이트)로 덮어쓸 것**입니다.
* 따라서, 공격자가 다시 chunk1의 내용을 제어할 수 있다면, **스택 내부에 쓸 수 있게 되어 반환 주소를 덮어쓰고 canary를 건드리지 않고 로컬 변수의 값을 및 포인터를 수정할 수 있을 것**입니다. 또한 다시 chunk1이 스택에 저장된 주소를 다른 위치로 수정할 수 있게 되어 chunk1의 내용을 다시 제어할 수 있다면 어디에든 쓸 수 있을 것입니다.
* 이것이 가능했던 이유는 **주소가 스택에 저장**되어 있었기 때문입니다. 위험 및 악용은 **가짜 청크의 주소가 어디에 저장되어 있는지**에 따라 달라질 수 있습니다.
* 이전에 `fake_chunk->fd->bk``fake_chunk->fd->bk`가 동일한 위치(스택에 chunk1이 저장된 위치)를 가리키도록 만들었으므로 유효한 연결된 목록이었습니다. **두 위치가 동일한 위치를 가리키고 있기 때문에** 마지막 것만(`fake_chunk->bk->fd = fake_chunk->fd`) **적용**됩니다.
* 이로 인해 스택에 있는 chunk1의 포인터가 스택에서 3 주소 앞에 저장된 주소(또는 바이트)로 덮어씌워집니다.
* 따라서, 공격자가 다시 chunk1의 내용을 제어할 수 있다면, 스택 내부에 **쓸 수 있게** 되어 반환 주소를 덮어쓰고 canary를 건드리지 않고 로컬 변수의 값을 및 포인터를 수정할 수 있을 것입니다. 또한 다시 chunk1이 스택에 저장된 주소를 다른 위치로 변경할 수 있게 되면, 공격자가 다시 chunk1의 내용을 제어할 수 있다면 어디든 쓸 수 있을 것입니다.
* 이것이 가능했던 이유는 **주소가 스택에 저장**되어 있었기 때문입니다. 위험 및 악용은 **가짜 덩어리의 주소가 어디에 저장되어 있는지**에 따라 달라질 수 있습니다.
<figure><img src="../../.gitbook/assets/image (1246).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
@ -130,6 +130,22 @@ return 0;
* [https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit](https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit)
* CTF에서 심지어 unlink 공격을 찾는 것이 이상할 수 있지만, 이 공격이 사용된 writeup을 확인할 수 있는 몇 가지 예시가 있습니다:
* CTF 예시: [https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html](https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html)
* 이 예시에서는 스택 대신 malloc된 주소의 배열이 있습니다. unlink 공격은 여기에 청크를 할당할 수 있도록 수행되어 malloc된 주소의 배열의 포인터를 제어할 수 있게 합니다. 그런 다음, 이러한 주소의 청크 내용을 수정할 수 있는 다른 기능이 있어 GOT를 가리키는 주소를 지정하거나 함수 주소를 수정하여 누출 및 RCE를 얻을 수 있습니다.
* 이 예시에서는 스택 대신 malloc된 주소의 배열이 있습니다. unlink 공격은 여기에 덩어리를 할당할 수 있도록 수행되어, malloc된 주소의 배열의 포인터를 제어할 수 있게 됩니다. 그런 다음, 이러한 주소의 덩어리 내용을 수정할 수 있는 다른 기능이 있어서 주소를 GOT로 가리키게 하고 함수 주소를 수정하여 leaks 및 RCE를 얻을 수 있습니다.
* 다른 CTF 예시: [https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html](https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html)
* 이전 예시와 마찬가지로 할당 주소의 배열이 있습니다. unlink 공격을 수행하여 첫 번째 할당 주소가 배열 시작 부분보다 앞에 있는 몇 가지 위치를 가리키도록 만들고, 그런 다음 이 할당을 새 위치에 덮어쓸 수 있습니다. 따라서, 다른 할당의 포인터를 GOT의 atoi를 가리키도록 덮어쓸 수 있고, libc 누출을 얻기 위해 이를 출력하고, 그런 다음 atoi GOT를 one gadget 주소로 덮어쓸 수 있습니다.
* 이전 예시와 마찬가지로, 할당 주소의 배열이 있습니다. unlink 공격을 수행하여 첫 번째 할당 주소가 배열 시작 부분보다 앞에 있는 몇 가지 위치를 가리키도록 만들고, 그런 다음 이 새 위치에 할당을 덮어씁니다. 따라서, 다른 할당의 포인터를 GOT의 atoi로 가리키도록 덮어쓰고 libc leak을 얻기 위해 이를 출력하고, 그런 다음 atoi GOT을 one gadget 주소로 덮어쓸 수 있습니다.
* unlink 공격과 매우 유사한 취약점을 악용하는 사용자 정의 malloc 및 free 함수가 있는 CTF 예시: [https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html)
* 사용자 정의 malloc의 FD 및 BK 포인터를 제어할 수 있는 오버플로우가 있습니다. 또한, 힙에 exec 비트가 있어서 힙 주소를 유출하고 GOT의 함수를 힙 덩어리에 쉘코드로 가리키는 것이 가능합니다.
<details>
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Other ways to support HackTricks:
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>

View file

@ -6,11 +6,11 @@
HackTricks를 지원하는 다른 방법:
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](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)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**팔로우**하세요.
* **HackTricks****HackTricks Cloud** 깃허브 저장소로 PR을 제출하여 **해킹 트릭을 공유**하세요.
- **회사가 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)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**팔로우**하세요.
- **HackTricks****HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
</details>
@ -24,43 +24,46 @@ unsorted bin이 무엇인지에 대한 자세한 정보는 다음 페이지를
정렬되지 않은 목록은 `unsorted_chunks (av)`의 주소를 청크의 `bk` 주소에 쓸 수 있습니다. 따라서, 공격자가 정렬되지 않은 bin 내부의 청크에서 **bk 포인터의 주소를 수정**할 수 있다면, 임의의 주소에 해당 주소를 쓸 수 있어 libc 주소를 노출하거나 일부 방어를 우회하는 데 도움이 될 수 있습니다.
따라서, 기본적으로 이 공격은 **큰 숫자(힙 주소 또는 libc 주소가 될 수 있는 주소)로 일부 임의의 주소를 덮어쓸 수 있게 했으며**, 누출될 수 있는 스택 주소 또는 전역 변수인 **`global_max_fast`**와 같은 제한을 우회하여 더 큰 크기의 fast bin bins를 생성할 수 있도록 허용하여 정렬되지 않은 bin 공격에서 fast bin 공격으로 전환할 수 있습니다.
따라서, 기본적으로 이 공격은 **임의의 주소를 큰 숫자로 덮어쓸 수 있게 했음**을 의미합니다(힙 주소 또는 libc 주소일 수 있는 주소) - 누출될 수 있는 스택 주소 또는 글로벌 변수인 **`global_max_fast`**와 같은 제한을 우회하여 더 큰 크기의 fast bin bins를 생성할 수 있도록 허용합니다(정렬되지 않은 bin 공격에서 fast bin 공격으로 전환).
{% hint style="success" %}
[https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle)에서 제공된 예제를 살펴보고 0x400과 0x500 대신 0x4000과 0x5000을 사용하여 (tcaches를 피하기 위해) **현재** 오류 **`malloc(): unsorted double linked list corrupted`**가 트리거되는 것을 볼 수 있습니다.
[https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle)에서 제공된 예제를 살펴보고 0x400과 0x500 대신 0x4000 및 0x5000을 청크 크기로 사용하면(티캐시를 피하기 위해) **현재** 오류 **`malloc(): unsorted double linked list corrupted`**가 트리거되는 것을 볼 수 있습니다.
따라서, 이제 이 unsorted bin 공격은 (다른 확인 사항과 함께) 또한 이중 연결 목록을 수정할 수 있어야 하므로 이중 연결 목록이 우회되어야 합니다 `victim->bck->fd == victim` 또는 `victim->fd == av (arena)`. 즉, 우리가 원하는 주소는 가짜 청크의 주소가 `fd` 위치에 있어야 하며, 가짜 청크 `fd`가 아레나를 가리켜야 합니다.
따라서, 이제 이 unsorted bin 공격은(다른 확인 사항과 함께) 또한 이중 연결 목록을 수정할 수 있어야 하므로 이중 연결 목록이 우회되어야 합니다 `victim->bck->fd == victim` 또는 `victim->fd == av (arena)`. 즉, 우리가 원하는 주소는 가짜 청크의 주소가 `fd` 위치에 있어야 하며, 가짜 청크 `fd`가 아레나를 가리켜야 합니다.
{% endhint %}
{% hint style="danger" %}
이 공격은 정렬되지 않은 bin을 손상시킵니다 (따라서 작은 크기와 큰 크기도 손상됨). 따라서 이제 **이제 fast bin에서 할당만 사용할 수 있습니다** (더 복잡한 프로그램은 다른 할당을 수행하고 충돌할 수 있음) 및 이를 트리거하려면 **동일한 크기로 할당해야 합니다.**
이 공격은 정렬되지 않은 bin을 손상시킵니다(따라서 작은 크기와 큰 크기 모두). 따라서 이제 **이제 fast bin에서만 할당을 사용할 수 있습니다**(더 복잡한 프로그램은 다른 할당을 수행하고 충돌할 수 있음) 및 이를 트리거하려면 **동일한 크기로 할당해야 합니다.**
이 경우 **`global_max_fast`**를 만드는 것이 도움이 될 수 있으며, fast bin이 모든 다른 할당을 처리할 수 있을 것으로 신뢰할 수 있습니다. 이 공격을 완료할 때까지.
이 경우 **`global_max_fast`**를 만드는 것이 도움이 될 수 있으며, fast bin이 모든 다른 할당을 처리할 수 있을 것으로 신뢰할 수 있습니다. 공격이 완료될 때까지.
{% endhint %}
[**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html)의 코드는 매우 잘 설명하고 있지만, malloc을 수정하여 tcache에 끝나지 않도록 충분히 큰 메모리를 할당하면 이전에 언급한 오류가 발생하여 이 기술을 방지하는 것을 볼 수 있습니다: **`malloc(): unsorted double linked list corrupted`**
[**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html)의 코드는 이를 매우 잘 설명하지만, malloc을 수정하여 tcache에 끝나지 않도록 충분히 큰 메모리를 할당하면 이전에 언급한 오류가 발생하여 이 기술을 방지하는 것을 볼 수 있습니다: **`malloc(): unsorted double linked list corrupted`**
## Unsorted Bin Infoleak Attack
이것은 실제로 매우 기본적인 개념입니다. 정렬되지 않은 bin의 청크는 bin을 만들기 위해 이중 포인터를 가지게 됩니다. 정렬되지 않은 bin의 첫 번째 청크는 실제로 **FD****BK** 링크가 **메인 아레나(libc)의 일부를 가리키게 됩니다**.\
따라서, **unsorted bin에 청크를 넣고 읽을 수 있게 하거나** (free 후 사용) **적어도 1개의 포인터를 덮어쓰지 않고 다시 할당하여** 그 후 **읽을 수 있다면**, **libc 정보 누출**이 가능합니다.
따라서, unsorted bin에 청크를 넣고 읽거나(사용 후 해제) **다시 할당하여 적어도 1개의 포인터를 덮어쓰지 않고** 읽으면 **libc 정보 누출**을 얻을 수 있습니다.
## 참조 및 다른 예제
이 [**writeup에서 사용된 유사한 공격**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html)은 4개의 청크 구조(A, B, C 및 D - D는 상단 청크와의 통합을 방지하기 위한 것)를 남용하여 B의 널 바이트 오버플로우를 사용하여 C가 B가 사용되지 않았음을 나타내도록 만들었습니다. 또한, B에서 `prev_size` 데이터가 수정되어 B의 크기가 아닌 A+B의 크기가 되었습니다.\
그런 다음 C가 해제되고 A+B와 통합되었지만 B는 여전히 사용 중이었습니다. 크기 A의 새로운 청크가 할당되었고 그런 다음 libc 유출 주소가 B로 쓰여졌습니다.
## 참고 및 다른 예제
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap)
* 글로벌 변수를 4869보다 큰 값으로 덮어쓰기 위한 목표이며, PIE가 활성화되지 않았습니다.
* 임의의 크기의 청크를 생성할 수 있으며 원하는 크기의 힙 오버플로우가 있습니다.
* 공격은 3개의 청크를 생성하여 시작됩니다: 오버플로우를 악용하기 위한 청크0, 오버플로우될 청크1 및 이전 청크를 합병하지 않도록 하는 청크2.
* 그런 다음, 청크1이 해제되고 청크0이 오버플로우되어 `bk` 포인터가 `bk = magic - 0x10`를 가리키도록 합니다.
* 그런 다음, 청크3이 청크1과 동일한 크기로 할당되어 정렬되지 않은 bin 공격을 트리거하고 글로벌 변수의 값을 수정하여 플래그를 획득할 수 있게 합니다.
* 공격은 3개의 청크를 생성하여 시작됩니다: 오버플로우를 남용하기 위한 청크0, 오버플로우를 받을 청크1 및 이전 청크들이 통합되지 않도록 하는 청크2.
* 그런 다음, 청크1이 해제되고 청크0이 청크1의 `bk` 포인터로 오버플로우되어 `bk = magic - 0x10`을 가리키게 합니다.
* 그런 다음, 청크3이 청크1과 동일한 크기로 할당되어 정렬되지 않은 bin 공격이 트리거되고 글로벌 변수의 값을 수정하여 플래그를 얻을 수 있게 됩니다.
* [**https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html)
* 병합 함수는 두 인덱스가 동일한 경우 다시 할당하고 그 후에 해제하지만 사용할 수 있는 그 해제된 영역을 가리키는 포인터를 반환합니다.
* 따라서, **2개의 청크가 생성**됩니다: **자신과 병합될 청크0**이전 청크와 병합되지 않도록 하는 청크1. 그런 다음, **청크0으로 병합 함수가 두 번 호출**되어 사용 후 해제가 발생합니다.
* 그런 다음, **`view`** 함수가 사용 후 해제된 청크의 인덱스인 2로 호출되어 **libc 주소를 누출**합니다.
* 바이너리가 **`global_max_fast`**보다 큰 크기의 malloc만 허용하도록 보호되어 있으므로 fastbin을 사용하지 않으므로 unsorted bin 공격을 사용하여 글로벌 변수 `global_max_fast`를 덮어쓸 수 있습니다.
* 그런 다음, 사용 후 해제 포인터인 인덱스 2로 편집 함수를 호출하여 `bk` 포인터를 `p64(global_max_fast-0x10)`을 가리키도록 덮어쓰고, 이전에 손상된 해제 주소(0x20)를 사용하여 새로운 청크를 만들면 **unsorted bin 공격이 트리거**되어 `global_max_fast`를 덮어쓰고 매우 큰 값으로 설정하여 이제 fast bin에 청크를 생성할 수 있습니다.
* 병합 함수는 두 인덱스가 동일한 경우 다시 할당하고 그것을 해제하지만 그 해제된 영역을 사용할 수 있는 포인터를 반환합니다.
* 따라서, **2개의 청크가 생성**됩니다: **자신과 병합될 청크0**상단 청크와 통합되지 않도록 하는 청크1. 그런 다음, **청크0으로 병합 함수가 두 번 호출**되어 사용 후 해제가 발생합니다.
* 그런 다음, **`view` 함수가 사용 후 해제된 청크의 인덱스인 2로 호출**되어 **libc 주소를 누출**합니다.
* 바이너리가 **`global_max_fast`**보다 큰 크기의 malloc만 허용하는 보호를 가지고 있기 때문에 fastbin을 사용하지 않으므로 unsorted bin 공격이 사용되어 **global 변수 `global_max_fast`를 덮어쓸 수 있습니다**.
* 그런 다음, 사용 후 해제 포인터인 인덱스 2로 편집 함수를 호출하여 `bk` 포인터를 `p64(global_max_fast-0x10)`을 가리키도록 덮어쓰고, 이전에 손상된 해제 주소(0x20)를 사용하여 새로운 청크를 만들면 **unsorted bin 공격이 트리거**되어 `global_max_fast`를 덮어쓰고 매우 큰 값으로 설정하여 이제 fast bin에 청크를 생성할 수 있습니다.
* 이제 **fast bin 공격**이 수행됩니다:
* 먼저 **`__free_hook` 위치에 크기가 200인 fast 청크로 작업할 수 있다는 것을 발견**했습니다:
* 먼저 **`__free_hook` 위치에 크기 200의 fast 청크로 작업할 수 있다는 것을 발견**했습니다:
* <pre class="language-c"><code class="lang-c">gef➤ p &#x26;__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 &#x3C;__free_hook>
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
@ -69,8 +72,24 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6076f &#x3C;list_all_lock+15>: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6077f &#x3C;_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
</code></pre>
* 만약 우리가 이 위치에 크기 0x200의 빠른 청크를 얻는다면, 실행될 함수 포인터를 덮어쓸 수 있을 것입니다.
* 이를 위해 크기 `0xfc`의 새로운 청크가 생성되고 병합된 함수가 해당 포인터로 두 번 호출되어, 우리는 빠른 빈에서 크기가 `0xfc*2 = 0x1f8`인 해제된 청크를 가리키는 포인터를 얻습니다.
* 만약 이 위치에 크기가 0x200인 fast chunk를 얻을 수 있다면 실행될 함수 포인터를 덮어쓸 수 있을 것입니다.
* 이를 위해 크기`0xfc`인 새로운 청크가 생성되고 해당 포인터로 두 번 병합된 함수가 호출되어 fast bin에 크기가 `0xfc*2 = 0x1f8`인 해제된 청크의 포인터를 얻습니다.
* 그런 다음, 이 청크에서 **`fd`** 주소를 이전 **`__free_hook`** 함수를 가리키도록 수정하기 위해 편집 함수가 호출됩니다.
* 그런 다음, 크기가 `0x1f8`인 청크가 생성되어 빠른 빈에서 이전에 쓸모없던 청크를 검색하고, 다른 크기가 `0x1f8`인 청크가 **`__free_hook`**에 있는 빠른 빈 청크를 얻어 **`system`** 함수의 주소로 덮어씁니다.
* 마지막으로 `/bin/sh\x00` 문자열이 포함된 청크가 삭제 함수를 호출하여 해제되고, **`__free_hook`** 함수가 트리거되어 `/bin/sh\x00`을 매개변수로 사용하여 시스템을 가리킵니다.
* 그런 다음, 크기가 `0x1f8`인 청크가 생성되어 fast bin에서 이전에 쓸모없는 청크를 검색하고, **`__free_hook`**에 fast bin 청크를 얻기 위해 크기가 `0x1f8`인 또 다른 청크가 생성되어 **`system`** 함수의 주소로 덮어씌웁니다.
* 마지막으로 `/bin/sh\x00` 문자열이 포함된 청크가 삭제 함수를 호출하여 해제되고, **`__free_hook`** 함수를 트리거하여 `/bin/sh\x00`을 매개변수로 사용하여 system을 가리키게 됩니다.
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
* unsorted bin에서 청크를 통합하고 libc 정보 누출을 얻은 다음 malloc 후크를 원 갓젯 주소로 덮어쓰기 위해 fast bin 공격을 수행하는 1바이트 오버플로우를 악용하는 또 다른 예제
<details>
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Other ways to support HackTricks:
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>