서론
이번에는 calc_tcache_idx.c을 해볼 것이다.
설명은
Demonstrating glibc's tcache index calculation.
glibc의 tcache 인덱스 계산 방식을 시연
라고 되어있다.
본론
우선 이 학습에서는 tcache 인덱스 계산 방식을 이해하는 것이다.
우분투를 켜보겠다.

다음을 입력하면 다음과 같이 결과가 출력된다.

이 파일을 보면 우리가 알고싶은 것이 malloc(x)를 했을 때 그 청크는 tcache[idx]중 어디로 들어가는가? 가 중요한 포인트인 것을 알 수 있다.
malloc(x)에서 x는 유저가 요청한 크기를 말한다. 하지만 힙 내부에는 크기와 정렬 보정이 추가된다. 따라서 실제 할당 크기(CHUNKSIZE)가 된다.
CHUNKSIZE의 공식은
CHUNKSIZE = ( x + 0x8 + 0xf ) & ~0xf
-0x8 : SIZE_SZ 즉 청크헤더의 크기 (64bit시스템에서 8byte)
- 0xf : 정렬 보정용 마스크
-정렬 보정용 마스크란? : 메모리 할당 시 청크의 크기와 정렬을 맞추기 위해 사용하는 비트 마스크
- & ~0xf : 16byte 단위로 올림
즉 malloc(0x20)이 있으면 CHUNKSIZE = (0x20 + 0x8 + 0xf) & ~0xf = (0x37) & 0xf = 0x30이 되어 chunk는 0x30이 된다.
- (0x37) & 0xf = 0x30인 이유
-각 값을 이진수로 표현하면 0x37 = 0b011 0111, ~0xf = 0b1111 0000 이를 계산하면
0x37: 0011 0111
& ~0xf: 1111 0000
------------------------
0011 0000 = 0x30
이 된다.
tcache에는 64개의 슬롯이 있다. 각 슬롯은 idx = 0 ~ 63까지 0x20부터 시작해서 0x10씩 증가하는 사이즈 담당함
IDX 공식은 다음과 같다.
IDX = ( CHUNKSIZE - 0x20 ) / 0x10
이다.
만약에 이렇게 되면 malloc(0x20)이라면
CHUNKSIZE = 0x30
IDX = ( 0x30 - 0x20 ) / 0x10 = 1
이 되어 tcache[1]이 된다.
다른 예시를 들어보자면
malloc(0x57)이라면
CHUNKSIZE = ( 0x57 + 0x8 + 0xf ) & ~0xf = ( 0x6e) & ~0xf = 0x60
IDX = ( 0x60 - 0x20 ) / 0x10 = 0x40 / 0x10 = 0x4
따라서 tcache[4]가 된다.
직접 프로그램을 실행시킨 결과로 보면

마지막에 0x57의 결과를 보면 똑같이 idx가 4로 나온다.
참고로 IDX는 chunk가 bin에 몇 번째 슬롯에 저장될지 결정하는 인덱스 값이다.
결론
이를 배우는 이유는 tcache poisoning을 할 때 원하는 주소를 얻으려면 정확한 index 매핑을 알아야 한다.
- fake chunk를 만들 때 정확한 CHUNKSIZE를 계산해야 함
- malloc(x) → 어떤 tcache[idx]를 사용할지 예측 가능
- 익스플로잇 시 필요한 fake chunk 주소가 idx에 맞게 할당되도록 유도해야 함
'pwanble' 카테고리의 다른 글
| 03. [How2Heap] - fastbin_dup.c (0) | 2025.05.09 |
|---|---|
| -02. calc_tcache_idx.c (1) | 2025.04.30 |
| -01.first_fit.c (0) | 2025.04.30 |
| 01.How2Heap - first_fit.c (0) | 2025.04.16 |
| 00. 주제 선정하기 (0) | 2025.04.16 |