[Pwn] tcache house of spirit

코코·2024년 1월 26일
0

pwn

목록 보기
10/10

how2heap에 있는 tcache house of spirit에 대해 알아보자.



Example Code

코드는 how2heap에 있는 코드 중 설명만 제외하여 사용한다.

  • tcache_house_of_spirit.c
// 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 뒤에 가짜 Chunk를 만들 필요가 없다.
  • tcache_put이 다음 Chunk의 크기와 prev_inuse가 올바른지 검증하지 않고, 호출된다.

공격은 진짜 간단하다. 가짜 Chunk를 생성하여 Free시켜서 tcachebins에 넣어준다. 이 때 가짜 Chunk의 size는 tcachebins 영역에 알맞는 크기로 설정해준다(<= 0x410)
이후 malloc을 통해 메모리를 할당하면 가짜 Chunk 영역을 할당받는다.




Debugging Time

한 줄 한 줄 디버깅을 통해 살펴보자. 아래의 코드 일부분들은 모두 위의 예제 코드의 일부분이다.

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라는 단어에 겁을 먹었나?
끝. 🙌


참고
👉 https://github.com/shellphish/how2heap

profile
화이팅!

0개의 댓글