tcache(thread local cache)
heap 관리를 빠르게 하기 위해 glibc 2.26 이상부터 적용되는 기술.
fast bin과 유사하지만 다른 성격을 가짐.
tcache는 heap 영역에 존재함.
32 bit 에서는 516 byte 이하의 사이즈,
64 bit 에서는 1032 byte 이하의 사이즈가 할당되었을때 tcache를 사용함.
예제로 256 byte로 4개를 할당하고 첫번째 영역을 free 해서 fd, bk 값을 보면 다시 heap 영역을 가르키고 있으며,
gef➤ x/40gx 0x555555603000
0x555555603000: 0x0000000000000000 0x0000000000000291
0x555555603010: 0x0000000000000000 0x0000000000000000
0x555555603020: 0x0000000000000000 0x0001000000000000
...
0x555555603100: 0x0000000000000000 0x00005555556032a0
...
0x555555603290: 0x0000000000000000 0x0000000000000111
0x5555556032a0: 0x0000000555555603 0x0000555555603010
...
0x5555556033a0: 0x0000000000000000 0x0000000000000111
0x5555556033b0: 0x000000000a626262 0x0000000000000000
...
0x5555556034b0: 0x0000000000000000 0x0000000000000111
0x5555556034c0: 0x000000000a636363 0x0000000000000000
...
0x5555556035c0: 0x0000000000000000 0x0000000000000111
0x5555556035d0: 0x000000000a656565 0x0000000000000000
...
0x5555556036d0: 0x0000000000000000 0x0000000000020931
0x555555603108 위치에 free된 heap 영역의 주소를 담고 있는 것을 볼 수 있다.
tcache의 공간은 총 7개이며, 7개 free 이후에는 main_arena 내에서 각 목적에 맞는 bin으로 free된 주소를 관리한다.
fastbin과 매우 유사하지만,
tcache는 fd 영역에 fd 값이 있고, fastbin은 prev_size 값을 가진다.
tcache는 병합이 발생하지 않아서 prev_size와 prev_inuse bit을 가지지 않으며, 무한대로 할당할 수 없으니 위에서 설명한 것과 같이 7개 할당 이후에는 main_arena가 관리하며 병합시킨다.
main_arena
만일 tcache에서 관리되지 않는 size로 동적 할당 후 해제되면 그 크기에 맞는 bin에서 관리하며, bin들을 다시 한번 관리하는 것이 main_arena이다. 이는 libc에 존재하는 구조체이기에 memory leak 시 main_arena의 address leak이 가능해지며, 이를 이용해서 libc base, offset을 구할 수 있다.
예제로 1033 byte의 할당 1회, 256 byte의 할당 후 1033 byte 부분을 free 하면 위의 예제와 다르게 heap 영역 내에 별도 관리되는 값이 없으며, 아래와 같이 fd, bk는 main_arena의 주소를 가지게 된다.
gef➤ x/40gx 0x555555603000
0x555555603000: 0x0000000000000000 0x0000000000000291
0x555555603010: 0x0000000000000000 0x0000000000000000
0x555555603020: 0x0000000000000000 0x0000000000000000
0x555555603030: 0x0000000000000000 0x0000000000000000
0x555555603040: 0x0000000000000000 0x0000000000000000
0x555555603050: 0x0000000000000000 0x0000000000000000
0x555555603060: 0x0000000000000000 0x0000000000000000
0x555555603070: 0x0000000000000000 0x0000000000000000
0x555555603080: 0x0000000000000000 0x0000000000000000
0x555555603090: 0x0000000000000000 0x0000000000000000
0x5555556030a0: 0x0000000000000000 0x0000000000000000
0x5555556030b0: 0x0000000000000000 0x0000000000000000
0x5555556030c0: 0x0000000000000000 0x0000000000000000
0x5555556030d0: 0x0000000000000000 0x0000000000000000
0x5555556030e0: 0x0000000000000000 0x0000000000000000
0x5555556030f0: 0x0000000000000000 0x0000000000000000
0x555555603100: 0x0000000000000000 0x0000000000000000
0x555555603110: 0x0000000000000000 0x0000000000000000
0x555555603120: 0x0000000000000000 0x0000000000000000
0x555555603130: 0x0000000000000000 0x0000000000000000
0x555555603140: 0x0000000000000000 0x0000000000000000
0x555555603150: 0x0000000000000000 0x0000000000000000
0x555555603160: 0x0000000000000000 0x0000000000000000
0x555555603170: 0x0000000000000000 0x0000000000000000
0x555555603180: 0x0000000000000000 0x0000000000000000
0x555555603190: 0x0000000000000000 0x0000000000000000
0x5555556031a0: 0x0000000000000000 0x0000000000000000
0x5555556031b0: 0x0000000000000000 0x0000000000000000
0x5555556031c0: 0x0000000000000000 0x0000000000000000
0x5555556031d0: 0x0000000000000000 0x0000000000000000
0x5555556031e0: 0x0000000000000000 0x0000000000000000
0x5555556031f0: 0x0000000000000000 0x0000000000000000
0x555555603200: 0x0000000000000000 0x0000000000000000
0x555555603210: 0x0000000000000000 0x0000000000000000
0x555555603220: 0x0000000000000000 0x0000000000000000
0x555555603230: 0x0000000000000000 0x0000000000000000
0x555555603240: 0x0000000000000000 0x0000000000000000
0x555555603250: 0x0000000000000000 0x0000000000000000
0x555555603260: 0x0000000000000000 0x0000000000000000
0x555555603270: 0x0000000000000000 0x0000000000000000
0x555555603280: 0x0000000000000000 0x0000000000000000
0x555555603290: 0x0000000000000000 0x0000000000000421
0x5555556032a0: 0x00007ffff7fa5c00 0x00007ffff7fa5c00
...
0x5555556036b0: 0x0000000000000420 0x0000000000000110
0x5555556036c0: 0x0000000a62626262 0x0000000000000000
...
0x5555556037c0: 0x0000000000000000 0x0000000000020841
gef➤ x/i 0x00007ffff7fa5c00
0x7ffff7fa5c00 <main_arena+96>: shlb $0x60,(%rdi)
다만 main_arena의 주소는 특별히 찾아지지 않는데, 이는 malloc_hook 함수와 함께하며, malloc_hook + 0x10에 위치하게된다.
'Tips & theory' 카테고리의 다른 글
heap tcache poisoning & double free (0) | 2022.08.02 |
---|---|
보호 기법 및 공격 시나리오 요약 (0) | 2022.08.01 |
fsb (0) | 2022.07.30 |
입/출력 함수의 입력, 출력 방식. (0) | 2022.07.29 |
libc에서 offset 찾기. (0) | 2022.07.29 |