Translated ['binary-exploitation/heap/house-of-einherjar.md', 'binary-ex

This commit is contained in:
Translator 2024-06-13 15:11:33 +00:00
parent f22234dc7c
commit 871c20e832
5 changed files with 143 additions and 80 deletions

View file

@ -740,7 +740,7 @@
* [Tcache Bin Attack](binary-exploitation/heap/tcache-bin-attack.md)
* [Off by one overflow](binary-exploitation/heap/off-by-one-overflow.md)
* [House of Spirit](binary-exploitation/heap/house-of-spirit.md)
* [House of Lore](binary-exploitation/heap/house-of-lore.md)
* [House of Lore | Small bin Attack](binary-exploitation/heap/house-of-lore.md)
* [House of Einherjar](binary-exploitation/heap/house-of-einherjar.md)
* [House of Force](binary-exploitation/heap/house-of-force.md)
* [House of Orange](binary-exploitation/heap/house-of-orange.md)

View file

@ -2,15 +2,15 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 영웅까지 배우세요</strong>!</summary>
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team 전문가)</strong></a><strong>!</strong></summary>
다른 HackTricks 지원 방법:
HackTricks 지원하는 다른 방법:
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원하면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구하세요
* **회사가 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 Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
</details>
@ -18,44 +18,39 @@
### 코드
* [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://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를 채워야 할 수도 있음)
### 목표
* 거의 모든 특정 주소에 메모리를 할당하는 것이 목표입니다.
* 거의 모든 특정 주소에 메모리를 할당하는 것
### 요구 사항
* 다음 청크의 헤더에서 하나가 부족하여 `prev in use`를 수정할 수 있어야 합니다.
* 현재 청크의 일부인 `prev_size` 데이터를 수정할 수 있어야 합니다.
* 힙 누수
* 청크를 할당하려는 경우 가짜 청크를 생성:
* 포인터를 자신을 가리키도록 설정하여 무결성 검사를 우회
* 한 청크에서 다른 청크로의 한 칸 오류를 낼 수 있어야 함
* 오류를 일으킨 청크의 `prev_size`에 자신과 가짜 청크 사이의 차이를 표시
* 가짜 청크 크기도 무결성 검사를 우회하기 위해 동일한 크기로 설정되어야 함
* 이러한 청크를 구성하려면 힙 누수가 필요함
### 공격
* 공격자가 제어하는 청크 내에 `fd``bk`를 가리키는 가짜 청크 `A`가 생성되어 보호 기능을 우회합니다.
* 다른 2개의 청크(`B` 및 `C`)가 생성됩니다.
* `B`에서의 off by one을 악용하여 `prev in use` 비트가 지워지고 `prev_size` 데이터가 `C` 청크가 할당된 위치와 이전에 생성된 가짜 `A` 청크 사이의 차이로 덮어씌워집니다.
* 이 `prev_size`와 가짜 청크 `A`의 크기는 체크를 우회하기 위해 동일해야 합니다.
* 그런 다음, Tcache가 채워집니다.
* 그런 다음, `C`가 해제되어 가짜 청크 `A`와 통합됩니다.
* 그런 다음, 가짜 `A` 청크에서 시작하고 `B` 청크를 포함하는 새로운 청크 `D`가 생성됩니다.
* 그런 다음, `B`가 해제되고 `fd`가 대상 주소를 가리키도록 덮어씌워집니다. 이는 그것을 포함하는 `D` 청크를 악용합니다.
* 그런 다음, 대상 주소를 포함하는 두 번의 malloc가 수행됩니다.
* 공격자가 제어하는 청크 내에 `fd``bk`로 원래 청크를 가리키는 가짜 청크가 생성됨
* 다른 2개의 청크 (`B` 및 `C`)가 할당됨
* `B`에서 오류를 낼 경우 `prev in use` 비트가 지워지고 `prev_size` 데이터가 `C` 청크가 할당된 위치와 이전에 생성된 가짜 `A` 청크 사이의 차이로 덮어씌워짐
* 이 `prev_size` 및 가짜 청크 `A`의 크기는 검사를 우회하기 위해 동일해야 함
* 그런 다음 tcache가 채워짐
* 그런 다음 `C`가 해제되어 가짜 청크 `A`와 통합됨
* 그런 다음 새로운 청크 `D`가 생성되는데, 이는 가짜 `A` 청크에서 시작하여 `B` 청크를 덮음
* Einherjar의 집이 여기서 끝남
* 이것은 fast bin 공격으로 계속될 수 있음:
* `B`를 해제하여 fast bin에 추가
* `B``fd`를 덮어쓰어 `D` 청크를 악용한 대상 주소를 가리키도록 함 (이는 `B`를 포함하고 있기 때문)
* 그런 다음 2개의 malloc이 수행되고 두 번째 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)
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 영웅까지 배우세요</strong>!</summary>
다른 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을 제출하여 **해킹 트릭을 공유**하세요.
</details>
* [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)
* 포인터를 해제한 후에는 null로 초기화되지 않으므로 여전히 데이터에 액세스할 수 있음. 따라서 청크가 정렬되지 않은 bin에 배치되고 포함된 포인터를 누출시키고 (libc 누출) 그런 다음 새로운 힙이 정렬되지 않은 bin에 배치되어 얻은 포인터에서 힙 주소를 누출함.

View file

@ -1,16 +1,16 @@
# House of Lore
# House of Lore | Small bin Attack
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 영웅까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 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)를 구하세요
* **회사가 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**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
</details>
@ -18,30 +18,54 @@ HackTricks를 지원하는 다른 방법:
### 코드
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/)에서 확인
* 이것은 작동하지 않습니다
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/)에서 확인하세요
* 또는: [https://github.com/shellphish/how2heap/blob/master/glibc\_2.39/house\_of\_lore.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.39/house\_of\_lore.c)
* 이것은 작동하지 않습니다. 일부 확인을 우회하려고 시도해도 오류가 발생합니다: `malloc(): unaligned tcache chunk detected`
* 이 예제는 여전히 작동 중입니다**:** [**https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html**](https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html)&#x20;
### 목표
* 작은 bin에 가짜 작은 청크를 삽입하여 할당할 수 있도록 함
* **작은 bin에 가짜 작은 청크를 삽입하여 할당할 수 있도록**합니다.\
작성자가 만든 작은 청크가 추가된 것이 가짜이며 임의의 위치에 가짜가 아닙니다.
### 요구 사항
* 가짜 청크 생성
* 피해자 청크 및 가짜 청크의 주소를 알아야 함
* `bk``fd` 포인터를 수정할 수 있어야 함
* 2개의 가짜 청크를 만들고 그들과 합쳐서 합법적인 청크와 작은 bin에 연결합니다:
* `fake0.bk` -> `fake1`
* `fake1.fd` -> `fake0`
* `fake0.fd` -> `legit` (다른 취약점을 통해 해제된 작은 bin 청크의 포인터를 수정해야 함)
* `legit.bk` -> `fake0`
그러면 `fake0`을 할당할 수 있게 됩니다.
### 공격
* 피해자 작은 청크가 할당됨
* 공격자는 몇 개의 가짜 작은 청크를 생성하고, 첫 번째 가짜 청크를 실제 청크를 가리키도록 `fd`를 설정하고, `bk`를 두 번째 가짜 청크를 가리키도록 함. 또한 두 번째 가짜 청크의 `bk`를 첫 번째 가짜 청크를 가리키도록 함.
* 그런 다음, 첫 번째 청크가 해제될 때 상단 청크에 병합되지 않도록 새로운 큰 청크가 할당됨
* 그런 다음, 초기 포인터가 해제되고 더 큰 크기의 두 번째 포인터가 할당되어 초기 작은 청크가 작은 bin에 배치됨
* 실제 작은 청크가 수정되어 `bk` 포인터가 가짜 청크를 가리키도록 함
* 그런 다음, 이 크기의 2개의 청크가 할당되면 공격자가 어떤 방식으로든 제어하는 유효하지 않은 청크가 먼저 오고 그 다음에 유효한 청크가 옴
* 작은 청크(`legit`)가 할당되고, 다른 하나가 상단 청크와 병합되는 것을 방지하기 위해 할당됩니다. 그런 다음, `legit`이 해제되어(정렬되지 않은 목록으로 이동) 더 큰 청크가 할당되어, **`legit`이 작은 bin으로 이동됩니다.**
* 공격자는 몇 개의 가짜 작은 청크를 생성하고, 필요한 링크를 만들어 정상성 검사를 우회합니다:
* `fake0.bk` -> `fake1`
* `fake1.fd` -> `fake0`
* `fake0.fd` -> `legit` (다른 취약점을 통해 해제된 작은 bin 청크의 포인터를 수정해야 함)
* `legit.bk` -> `fake0`
* 작은 청크가 할당되어 legit을 얻고, **`fake0`**을 작은 bin의 상단 목록으로 만듭니다
* 다른 작은 청크가 할당되어, fake0을 청크로 얻어, 내부의 포인터를 읽거나 쓸 수 있게 합니다.
## 참고 자료
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/)
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_lore](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_lore)
* [https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html](https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html)
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 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)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
</details>

View file

@ -2,15 +2,15 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>제로부터 영웅까지 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) 컬렉션
- **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
- **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출하세요.**
* **회사가 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)**를 팔로우**하세요.
* **해킹 트릭을 공유하고 싶다면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
</details>
@ -69,16 +69,51 @@ return 0;
### 목표
* 임의의 주소를 tcache / fast bin에 추가하여 malloc을 호출할 때 해당 청크가 사용되도록 함
* tcache / fast bin에 주소를 추가하여 나중에 할당할 수 있도록 함
### 요구 사항
* 이 공격은 공격자가 올바른 크기 값을 나타내는 몇 개의 가짜 fast 청크를 만들고, 그 크기로 빠르게 해제될 fast 청크를 덮어쓰기해야 하므로, 공격자의 청크가 실제로 fast bin에 들어가도록해야 함
* 이 공격은 공격자가 올바른 크기 값을 나타내는 몇 개의 가짜 fast 청크를 만들고, 첫 번째 가짜 청크를 해제하여 청크가 bin에 들어가도록 해야 함
### 공격
* 보안 검사를 우회하는 가짜 청크 생성 (가짜 청크 2개 필요)
* 포인터가 해제되기 전에 해당 포인터를 가짜 청크로 덮어쓰기하여 해당 청크가 bin에 들어가도록 함
* 보안 검사를 우회하는 가짜 청크 생성: 기본적으로 올바른 위치에 올바른 크기를 나타내는 2개의 가짜 청크가 필요함
* 첫 번째 가짜 청크를 해제하여 빠른 또는 tcache bin에 들어가도록 하고, 그 주소를 덮어쓰도록 할당함
**[guyinatuxedo](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html)**의 코드는 이 공격을 이해하는 데 좋음. 코드의 이 스키마는 이를 잘 요약함:
```c
/*
this will be the structure of our two fake chunks:
assuming that you compiled it for x64
+-------+---------------------+------+
| 0x00: | Chunk # 0 prev size | 0x00 |
+-------+---------------------+------+
| 0x08: | Chunk # 0 size | 0x60 |
+-------+---------------------+------+
| 0x10: | Chunk # 0 content | 0x00 |
+-------+---------------------+------+
| 0x60: | Chunk # 1 prev size | 0x00 |
+-------+---------------------+------+
| 0x68: | Chunk # 1 size | 0x40 |
+-------+---------------------+------+
| 0x70: | Chunk # 1 content | 0x00 |
+-------+---------------------+------+
for what we are doing the prev size values don't matter too much
the important thing is the size values of the heap headers for our fake chunks
*/
```
{% hint style="info" %}
두 번째 청크를 생성하여 일부 상태 확인을 우회해야 합니다.
{% endhint %}
## 예시
* CTF [https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html](https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html)
* **Libc infoleak**: 오버플로우를 통해 CTF의 read 동작을 통해 libc 주소를 노출시킬 수 있도록 포인터를 GOT 주소를 가리키도록 변경할 수 있음
* **House of Spirit**: "소총" 수를 세는 카운터를 악용하여 첫 번째 가짜 청크의 가짜 크기를 생성하고, "메시지"를 악용하여 두 번째 청크의 크기를 가짜로 만들고, 오버플로우를 악용하여 해제될 포인터를 변경하여 첫 번째 가짜 청크를 해제할 수 있음. 그런 다음 할당하고 그 안에 "메시지"가 저장된 주소가 있을 것임. 그런 다음 이를 `scanf` 진입점을 가리키도록 만들어 GOT 테이블 내부를 덮어쓸 수 있으므로 시스템 주소로 덮어쓸 수 있음.\
다음에 `scanf`가 호출될 때 입력 `"/bin/sh"`를 보내고 셸을 획들할 수 있음.
## 참고 자료
@ -86,12 +121,14 @@ return 0;
<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를 지원하는 다른 방법:
* **회사가 HackTricks에 광고되길 원하거나 PDF 형식의 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* **회사를 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) 컬렉션
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **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를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* **회사가 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을 제출하여 **해킹 요령을 공유**하세요.
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
* **HackTricks****HackTricks Cloud** github 저장소로 **PR 제출**하여 해킹 요령 공유하기.
</details>
@ -24,22 +24,29 @@ Tcache bin이 무엇인지에 대한 자세한 정보는 다음 페이지를 확
먼저, Tcache는 glibc 버전 2.26에서 소개되었음을 유의하십시오.
[**guyinatuxido 페이지**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html)에서 제안된 **Tcache** 공격은 fast bin 공격과 매우 유사하며, 목표는 해제된 청크 내부의 bin에서 다음 청크를 가리키는 포인터를 임의의 주소로 덮어쓰기하여 나중에 **해당 특정 주소를 할당하고 포인터를 덮어쓸 수 있도록**하는 것입니다.
[**guyinatuxido 페이지**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html)에서 제안된 **Tcache** 공격은 목표로 하는 것이 해제된 청크 내부의 bin 안의 다음 청크를 가리키는 포인터를 임의의 주소로 덮어쓰기하여 나중에 **해당 특정 주소를 할당하고 포인터를 덮어쓸 수 있도록** 하는 fast bin 공격과 매우 유사합니다.
그러나 현재는 해당 코드를 실행하면 **`malloc(): unaligned tcache chunk detected`** 오류가 발생합니다. 따라서 새 포인터에 정렬된 주소를 쓰거나 (또는 쓴 주소가 실제로 정렬된 주소인지 확인하기 위해 이진을 충분히 실행해야 함)해야합니다.
그러나 현재는 해당 코드를 실행하면 **`malloc(): unaligned tcache chunk detected`** 오류가 발생합니다. 따라서 새 포인터에 정렬된 주소를 쓰거나 (또는 쓴 주소가 실제로 정렬된 주소인지 확인하기 위해 이진을 충분히 실행해야 함)해야 합니다.
### Tcache 인덱스 공격
일반적으로 힙의 시작 부분에는 tcache 내의 **인덱스 당 청크 수**를 포함하고 있으며, **각 tcache 인덱스의 헤드 청크 주소**를 포함하는 청크가 있을 수 있습니다. 이 정보를 수정할 수 있는 경우, **일부 인덱스의 헤드 청크를 원하는 주소(예: malloc 후크)를 가리키도록 만들 수 있습니다**. 그런 다음 해당 인덱스의 크기로 청크를 할당하고 이 경우 malloc 후크의 내용을 덮어쓸 수 있습니다.
일반적으로 힙의 시작 부분에는 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를 채우고, unsorted 리스트에 청크를 추가한 후 tcache를 비우고 **unsorted bin에서 청크를 다시 할당**하여 처음 8B만 덮어쓰고 **청크의 두 번째 주소를 그대로 남겨 libc 주소를 읽을 수 있습니다**.
* **Tcache 공격**: 바이너리가 1B 힙 오버플로우 취약점을 가지고 있습니다. 이를 악용하여 할당된 청크의 **크기 헤더를 변경**하여 크게 만듭니다. 그런 다음 이 청크를 **해제**하여 가짜 크기의 tcache 청크에 추가합니다. 그런 다음 가짜 크기로 청크를 할당하고 이전 청크가 실제로 더 작았음을 알고 **다음 청크를 덮어쓸 수 있는 기회**를 얻습니다.\
이를 악용하여 **다음 청크의 FD 포인터를 덮어쓰기**하여 **`malloc_hook`**을 가리키도록 만들고, 그런 다음 수정한 정당한 포인터를 먼저 할당하고 두 번째 할당은 **`malloc_hook`**에 청크를 반환하여 **원 가젯을 작성**할 수 있습니다.
* **Libc 정보 누출**: tcache를 채우고 unsorted 리스트에 청크를 추가한 다음 tcache를 비우고 **unsorted bin에서 청크를 다시 할당**하여 처음 8B만 덮어쓰고 **청크의 두 번째 주소를 유지하여 libc 주소를 읽을 수 있습니다**.
* **Tcache 공격**: 바이너리가 1B 힙 오버플로우에 취약합니다. 이를 악용하여 할당된 청크의 **크기 헤더**를 변경하여 크게 만듭니다. 그런 다음 이 청크를 **해제**하여 가짜 크기의 tcache 청크에 추가합니다. 그런 다음 가짜 크기로 청크를 할당하고 이전 청크가 실제로 더 작았음을 알고 **다음 청크를 덮어쓸 수 있는 기회**를 얻습니다.\
이를 악용하여 **다음 청크의 FD 포인터를 덮어쓰기**하여 **`malloc_hook`**을 가리키도록 만들어 첫 번째로 수정한 합법적인 포인터를 할당하고, 두 번째 할당은 **`malloc_hook`**에 청크를 반환하여 **원 가젯을 작성할 수 있는** 기회를 제공합니다.
* CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html)
* **Libc 정보 누출**: use after free 및 double free가 있습니다. 이 writeup에서 작성자는 작은 bin에 배치된 청크의 주소를 읽어 libc 주소를 유출했습니다 (unsorted bin이 아닌 작은 bin에서 유출).
* **Tcache 공격**: **이중 해제**를 통해 Tcache가 수행됩니다. 동일한 청크가 두 번 해제되므로 Tcache 내에서 해당 청크는 자신을 가리킵니다. 그런 다음 할당되고, FD 포인터가 수정되어 **free 후크를 가리키도록**하고 다시 할당되어 목록의 다음 청크가 free 후크에 있게됩니다. 그런 다음 이것도 할당되어 `system` 주소를 여기에 쓸 수 있으므로 `"/bin/sh"`를 포함하는 malloc이 해제되면 쉘을 얻을 수 있습니다.
* **Libc 정보 누출**: 사용 후 무료 및 이중 무료가 있습니다. 이 글에서 작성자는 작은 bin에 배치된 청크의 주소를 읽어 libc 주소를 유출했습니다 (unsorted bin에서 누출하는 것처럼 작은 bin에서 누출).
* **Tcache 공격**: **이중 해제**를 통해 Tcache가 수행됩니다. 동일한 청크가 두 번 해제되므로 Tcache 내에서 청크가 자신을 가리킵니다. 그런 다음 할당되고 FD 포인터가 수정되어 **free 후크를 가리키도록**하고 다시 할당되어 목록의 다음 청크가 free 후크에 있게됩니다. 그런 다음 이것도 할당되어 `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)
* **Tcache 인덱스 공격**: tcache 정보에 저장된 크기의 청크를 할당하고 해제하여 **값이 0x100인 위치를 생성**할 수 있습니다 (해당 인덱스에 저장된 청크 수를 나타내는 바이트 때문에). 이 값을 악용하여 0x100 크기의 청크로 할당하면 다른 tcache 인덱스의 초기 청크 주소를 덮어쓸 수 있습니다. 예를 들어 그 중 하나에 malloc 후크 주소를 넣고 해당 인덱스의 크기로 청크를 할당하면 calloc 후크에 청크가 제공되어 원 가젯을 작성하여 쉘을 얻을 수 있습니다.
* 여기서 주요 취약점은 오프셋을 지정하여 힙에서 **모든 주소를 `free`**할 수 있는 능력입니다.
* **Tcache 인덱스 공격**: tcache 청크(각 bin의 청크 수를 저장하는 청크)에 저장될 때 **값이 0x100인 주소를 생성하는 크기의 청크를 할당하고 해제**할 수 있습니다. 이는 tcache가 각 bin의 청크 수를 다른 바이트에 저장하기 때문에 특정 인덱스의 한 청크가 값 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)
* 이전과 동일한 취약점이지만 추가 제한이 있습니다.
* **Tcache 인덱스 공격**: 이전 공격과 유사하지만 **tcache 정보를 포함하는 청크를 해제**하여 해당 주소가 해당 크기의 tcache 인덱스에 추가되어 해당 크기를 할당하고 tcache 청크 정보를 얻을 수 있으므로 free 후크를 하나의 인덱스 주소로 추가하고 할당하여 원 가젯을 작성할 수 있습니다.