AWS 해킹 학습 및 실습:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
GCP 해킹 학습 및 실습: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c)에서 예제 찾기
* 이 [패치](https://sourceware.org/git/?p=glibc.git;a=blobdiff;f=stdlib/abort.c;h=117a507ff88d862445551f2c07abb6e45a716b75;hp=19882f3e3dc1ab830431506329c94dcf1d7cc252;hb=91e7cf982d0104f0e71770f5ae8e3faf352dea9f;hpb=0c25125780083cbba22ed627756548efe282d1a0)에서 취약점이 수정되었으므로 이제 작동하지 않음 (2.26 이전 버전에서 작동)
* 더 많은 주석이 달린 동일한 예제는 [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)에 있음
공격은 **unsorted bin** 내부에 **top chunk**을 가져오는 것으로 시작합니다. 현재의 최상위 청크 크기보다 크지만 **`mmp_.mmap_threshold`** (기본값은 128K)보다 작은 크기로 `malloc`을 호출하여 이루어집니다. 최상위 청크 크기가 수정될 때마다 **top chunk + 해당 크기**가 페이지에 맞추어지고 **prev\_inuse** 비트가 항상 설정되어 있는지 확인하는 것이 중요합니다.
unsorted bin 내부에 top chunk을 얻으려면 최상위 청크를 만들기 위해 청크를 할당하고 최상위 청크 크기를 변경해야 합니다 (할당된 청크에서 오버플로우). 그래로 **top chunk + 크기**가 페이지에 맞추어지고 **prev\_inuse** 비트가 설정되어야 합니다. 그런 다음 새로운 최상위 청크 크기보다 큰 청크를 할당합니다. 최상위 청크를 unsorted bin으로 가져오기 위해 `free`가 호출되지 않는다는 점을 주목하세요.
unsorted bin 공격은 오버플로우를 악용하여 `topChunk->bk->fwd = _IO_list_all - 0x10`를 쓰는 것으로 수행됩니다. 새로운 청크가 할당되면 이전 최상위 청크가 분할되고 unsorted bin에 대한 포인터가 **`_IO_list_all`**에 쓰입니다.
1.**Small Bin 4에 삽입**: `malloc`이 unsorted bin을 스캔하고 이 청크를 볼 때 크기가 작기 때문에 이를 small bin 4에 삽입하려고 시도합니다. 이로 인해 이 청크는 small bin 4 목록의 헤드에 놓이게 되며 이는 우리가 unsorted bin 공격을 통해 **`_IO_list_all`**의 청크의 FD 포인터 위치에 가까운 주소를 썼기 때문입니다.
2.**Malloc 확인 트리거**: 이 청크 크기 조작은 `malloc`이 내부적인 확인을 수행하도록 만듭니다. 거짓 앞쪽 청크의 크기를 확인할 때 (이는 0이 될 것입니다), 오류가 발생하고 `malloc_printerr`가 호출됩니다.
작은 bin의 조작을 통해 청크의 전방 포인터를 제어할 수 있습니다. **\_IO\_list\_all**과의 중첩은 가짜 **\_IO\_FILE** 구조체를 조작하는 데 사용됩니다. 이 구조체는 libc에서 내부 확인을 통과하는 값으로 설정된 `_IO_write_base` 및 `_IO_write_ptr`와 같은 주요 필드를 포함하도록 주의 깊게 제작됩니다. 또한 가짜 구조체 내에 점프 테이블이 생성되며 명령 포인터가 임의의 코드 (예: `system` 함수)가 실행될 수 있는 주소로 설정됩니다.
가짜 **\_IO\_FILE** 구조체의 주요 필드인 `_IO_write_base` 및 `_IO_write_ptr`와 같은 필드는 libc에서 내부 확인을 통과하는 값으로 설정됩니다. 또한 가짜 구조체 내에 점프 테이블이 생성되며 명령 포인터가 임의의 코드가 실행될 수 있는 주소로 설정됩니다. 일반적으로 이는 `system` 함수의 주소 또는 쉘 명령을 실행할 수 있는 다른 함수의 주소일 것입니다.
이 접근 방식은 `free`를 직접 호출하지 않고도 코드 실행을 달성하기 위해 힙 관리 메커니즘, libc 정보 누출 및 힙 오버플로우를 악용합니다. 가짜 **\_IO\_FILE** 구조체를 주의 깊게 제작하고 올바른 위치에 배치하여 표준 메모리 할당 작업 중에 제어 흐름을 탈취할 수 있습니다. 이를 통해 임의의 코드 실행이 가능해지며 일반적으로 쉘 또는 다른 악성 활동이 실행됩니다.
AWS 해킹 학습 및 실습:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
GCP 해킹 학습 및 실습: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* 해킹 기법을 공유하고 싶다면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 PR을 제출하세요.