tcache 2.29 이상의 버전에서 key값 검사.. 이전 버전(ex..glibc 2.27)에선 별도 검사 없음.
또한 tcache 2.29(2.30)에서 DFB를 사용할때 tc_ idx값, 즉 청크 할당 및 해제를 3개 정도 하여 낮지 않은 값을 가지도록 한다. == 이는 이후 tcache_entry를 참조하여 할당할때 필요함.
(**https://velog.io/@woounnan/PWNABLE-tcache-bin-attack-in-glibc-2.30)
목표: duplicated free list를 이용하면 임의 주소에 청크를 할당할 수 있음을 이해하자.
duplicated free list는 임의의 청크를 두번이상 free하여 *free list(bin)에 여러번 청크를 추가하여 만들수 있다.
The Key point is "Dangling Pointer".
free list의 각 청크는 fd와 bk로 연결. 이때 fd는 자신보다 "이후"에 해제된 청크, bk는 "이전"에 해제된 청크를 가리킴.
해제된 청크에서 fd와 bk값을 저장하는 공간 == 할당된 청크에서 유저 데이터 영역.
즉 duplicated free list 로 fd, bk 조작 가능
위 사진을 보면 *key 포인터가 추가된 것을 알 수 있다. (*참고로 tcache_entry 는 tcache chunk가 갖는 구조이다.)
basic chunk's fd == tcache chunk's next --> LIFO 구조로 이전에 해제된 청크값은 필요 없어, bk에 대응값은 없다.
tcache_put함수이다. 이는 해제되는 청크의 key에 tcache(tcache_perthread)를 넣도록 수정되어있다.
tcache_get에는 재사용, 즉 할당되는 청크의 key값에 NULL을 대입하도록 변경되어있다.
청크를 할당 해제할때 free함수가 호출 되는데, tcache에 재할당, 즉 청크 해제할때(free호출시) 이 tcache 청크의 key값이 tcache이라면, 이미 해제 되어서 tcache_put을 호출하여 key에 tcache 를 넣어 주었다면, DFB로 abort하는 코드이다.
결국 key값의 1바이트 만이라도 바꿀 수 있다면, DFB가 가능하다!!
그 결과.
tcache_entry: 해제된 tcache 청크를 나타내는 구조체. 각 청크는 next라는 멤버 변수로 연결됨. Double free 보호 기법이 적용되면서, key라는 멤버 변수가 추가됨.
tcache_perthread_struct: tcache를 처음 사용하면 할당되는 구조체.
Double Free Bug: 한 청크를 두 번 해제할 수 있는 버그.
Tcache Duplication: tcache에 같은 청크가 두 번 연결되는 것.
'Pwnable > Tech' 카테고리의 다른 글
-STACK- Stack Canary (0) | 2022.01.06 |
---|---|
-Heap- Tcache Poisoning (0) | 2022.01.06 |
-Heap- ptmalloc2의 구조 (0) | 2022.01.05 |
Heap Series - Use After Free (0) | 2021.12.25 |
environ ptr -하나하나 뜯어보기- (0) | 2021.11.29 |