how2heap에 있는 tcache house of spirit에 대해 알아보자.
코드는 how2heap에 있는 코드 중 설명만 제외하여 사용한다.
// gcc -o thos tcache_house_of_spirit.c -no-pie
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main()
{
setbuf(stdout, NULL);
printf("Calling malloc() once so that it sets up its memory.\n");
malloc(1);
unsigned long long *a; //pointer that will be overwritten
unsigned long long fake_chunks[10]; //fake chunk region
fake_chunks[1] = 0x40; // this is the size
a = &fake_chunks[2];
free(a);
void *b = malloc(0x30);
assert((long)b == (long)&fake_chunks[2]);
}
tcache house of spirit 특징
공격은 진짜 간단하다. 가짜 Chunk를 생성하여 Free시켜서 tcachebins에 넣어준다. 이 때 가짜 Chunk의 size는 tcachebins 영역에 알맞는 크기로 설정해준다(<= 0x410)
이후 malloc을 통해 메모리를 할당하면 가짜 Chunk 영역을 할당받는다.
한 줄 한 줄 디버깅을 통해 살펴보자. 아래의 코드 일부분들은 모두 위의 예제 코드의 일부분이다.
fake_chunks[1] = 0x40; // this is the size
해당 줄을 보면, fake Chunk의 size를 0x40으로 설정하고 있다. 이를 디버깅을 통해 보면
위와 같다. 0x40으로 가짜 Chunk의 size를 설정해주고 있다.
a = &fake_chunks[2];
free(a);
fake Chunk의 Data부분(=FD)을 포인터 a에 넣고, 해제해주면 tcachebins에 들어간다!
Stack영역의 주소가 들어간 것을 확인할 수 있다.
void *b = malloc(0x30);
malloc 함수를 통해 할당을 요청하면, 0x7ffffffffdc80의 주소를 할당받을 것이다.
malloc 함수 호출 이후 rax 레지스터를 보면, tcachebins에 들어있던 주소를 할당받은 것을 확인할 수 있다.
생각했던 것 보다 너무 간단하다... house라는 단어에 겁을 먹었나?
끝. 🙌