# House of Roman {{#include ../../banners/hacktricks-training.md}} ## Basic Information 이 기술은 가짜 fastbins, unsorted_bin 공격 및 상대적 오버라이트를 통해 누수 없이 RCE를 가능하게 하는 매우 흥미로운 기술이었습니다. 그러나 [**패치되었습니다**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c). ### Code - 예제는 [https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)에서 찾을 수 있습니다. ### Goal - 상대 포인터를 악용하여 RCE ### Requirements - fastbin 및 unsorted bin 포인터 편집 - 12비트의 무작위성이 강제로 해결되어야 함 (작동 확률 0.02%) ## Attack Steps ### Part 1: Fastbin Chunk points to \_\_malloc_hook 여러 개의 청크를 생성합니다: - `fastbin_victim` (0x60, offset 0): 나중에 LibC 값을 가리키도록 힙 포인터를 편집할 UAF 청크. - `chunk2` (0x80, offset 0x70): 좋은 정렬을 위해 - `main_arena_use` (0x80, offset 0x100) - `relative_offset_heap` (0x60, offset 0x190): 'main_arena_use' 청크의 상대 오프셋 그런 다음 `free(main_arena_use)`를 호출하면 이 청크가 정렬되지 않은 목록에 배치되고 `fd` 및 `bk` 포인터 모두에서 `main_arena + 0x68`에 대한 포인터를 얻게 됩니다. 이제 `fake_libc_chunk(0x60)`라는 새로운 청크가 할당되며, 이는 `fd` 및 `bk`에서 `main_arena + 0x68`에 대한 포인터를 포함하게 됩니다. 그런 다음 `relative_offset_heap`과 `fastbin_victim`이 해제됩니다. ```c /* Current heap layout: 0x0: fastbin_victim - size 0x70 0x70: alignment_filler - size 0x90 0x100: fake_libc_chunk - size 0x70 (contains a fd ptr to main_arena + 0x68) 0x170: leftover_main - size 0x20 0x190: relative_offset_heap - size 0x70 bin layout: fastbin: fastbin_victim -> relative_offset_heap unsorted: leftover_main */ ``` - `fastbin_victim`은 `relative_offset_heap`을 가리키는 `fd`를 가지고 있습니다. - `relative_offset_heap`은 `fake_libc_chunk`로부터의 거리 오프셋으로, 여기에는 `main_arena + 0x68`에 대한 포인터가 포함되어 있습니다. - `fastbin_victim.fd`의 마지막 바이트를 변경하는 것만으로도 `fastbin_victim`이 `main_arena + 0x68`을 가리키도록 만들 수 있습니다. 이전 작업을 위해 공격자는 `fastbin_victim`의 fd 포인터를 수정할 수 있어야 합니다. 그런 다음, `main_arena + 0x68`은 그리 흥미롭지 않으므로 포인터를 **`__malloc_hook`**을 가리키도록 수정합시다. `__memalign_hook`은 일반적으로 `0x7f`로 시작하고 그 앞에 0이 있으므로, 이를 `0x70` 패스트 빈의 값으로 위조할 수 있습니다. 주소의 마지막 4비트가 **무작위**이기 때문에, 우리가 관심 있는 곳을 가리키도록 끝나는 값에 대해 `2^4=16`가지 가능성이 있습니다. 따라서 여기서 BF 공격이 수행되어 청크가 다음과 같이 끝납니다: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`**. (나머지 바이트에 대한 자세한 정보는 [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[ 예제](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)에서 확인하세요). BF가 작동하지 않으면 프로그램이 그냥 충돌하므로 (작동할 때까지 다시 시작하세요). 그런 다음, 2개의 malloc이 수행되어 2개의 초기 패스트 빈 청크가 제거되고, 세 번째 malloc이 할당되어 **`__malloc_hook:`**에서 청크를 가져옵니다. ```c malloc(0x60); malloc(0x60); uint8_t* malloc_hook_chunk = malloc(0x60); ``` ### Part 2: Unsorted_bin 공격 자세한 내용은 다음을 확인할 수 있습니다: {{#ref}} unsorted-bin-attack.md {{#endref}} 기본적으로 이는 `chunk->bk`에 지정된 위치에 `main_arena + 0x68`를 쓸 수 있게 해줍니다. 공격을 위해 `__malloc_hook`를 선택합니다. 그런 다음, 이를 덮어쓴 후 상대적 덮어쓰기를 사용하여 `one_gadget`을 가리키게 됩니다. 이를 위해 우리는 청크를 가져와 **unsorted bin**에 넣기 시작합니다: ```c uint8_t* unsorted_bin_ptr = malloc(0x80); malloc(0x30); // Don't want to consolidate puts("Put chunk into unsorted_bin\n"); // Free the chunk to create the UAF free(unsorted_bin_ptr); ``` 이 청크에서 UAF를 사용하여 `unsorted_bin_ptr->bk`를 `__malloc_hook`의 주소로 포인팅합니다(이전에는 이를 무작위로 시도했습니다). > [!CAUTION] > 이 공격은 정렬되지 않은 빈을 손상시킵니다(따라서 작은 것과 큰 것도). 따라서 이제 **빠른 빈에서 할당만 사용할 수 있습니다**(더 복잡한 프로그램은 다른 할당을 수행하고 충돌할 수 있습니다), 이를 트리거하기 위해서는 **같은 크기로 할당해야 하며, 그렇지 않으면 프로그램이 충돌합니다.** 따라서 `__malloc_hook`에 `unsorted_bin_ptr->bk`를 설정한 후 `main_arena + 0x68`의 쓰기를 트리거하기 위해서는 **`malloc(0x80)`**를 호출해야 합니다. ### 3단계: \_\_malloc_hook를 system으로 설정 1단계에서는 `__malloc_hook`를 포함하는 청크를 제어하게 되었고(변수 `malloc_hook_chunk`에서) 2단계에서는 여기에서 `main_arena + 0x68`을 기록하는 데 성공했습니다. 이제 `malloc_hook_chunk`에서 부분 덮어쓰기를 악용하여 우리가 여기에 기록한 libc 주소(`main_arena + 0x68`)를 **`one_gadget` 주소를 가리키도록** 사용합니다. 여기서 **12비트의 무작위성을 무작위로 시도해야 합니다**(자세한 내용은 [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[ 예제](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)에서 확인할 수 있습니다). 마지막으로, 올바른 주소가 덮어쓰여지면 **`malloc`을 호출하고 `one_gadget`을 트리거합니다.** ## References - [https://github.com/shellphish/how2heap](https://github.com/shellphish/how2heap) - [https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c) - [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_roman/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_roman/) {{#include ../../banners/hacktricks-training.md}}