[**guyinatuxido 페이지**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html)에서 제안된 **Tcache** 공격은 목표로 하는 것이 해제된 청크 내부의 bin 안의 다음 청크를 가리키는 포인터를 임의의 주소로 덮어쓰기하여 나중에 **해당 특정 주소를 할당하고 포인터를 덮어쓸 수 있도록** 하는 fast bin 공격과 매우 유사합니다.
그러나 현재는 해당 코드를 실행하면 **`malloc(): unaligned tcache chunk detected`** 오류가 발생합니다. 따라서 새 포인터에 정렬된 주소를 쓰거나 (또는 쓴 주소가 실제로 정렬된 주소인지 확인하기 위해 이진을 충분히 실행해야 함)해야 합니다.
일반적으로 힙의 시작 부분에는 tcache 내의 **인덱스 당 청크 수**를 포함하고 있으며 각 tcache 인덱스의 **헤드 청크 주소**를 포함하는 청크가 있습니다. 이 정보를 수정할 수 있는 경우, 특정 주소(예: malloc 후크)를 가리키도록 **일부 인덱스의 헤드 청크를 만들 수 있습니다**. 그런 다음 해당 인덱스의 크기로 청크를 할당하고 이 경우 malloc 후크의 내용을 덮어쓸 수 있습니다.
* **Libc 정보 누출**: tcache를 채우고 unsorted 리스트에 청크를 추가한 다음 tcache를 비우고 **unsorted bin에서 청크를 다시 할당**하여 처음 8B만 덮어쓰고 **청크의 두 번째 주소를 유지하여 libc 주소를 읽을 수 있습니다**.
* **Tcache 공격**: 바이너리가 1B 힙 오버플로우에 취약합니다. 이를 악용하여 할당된 청크의 **크기 헤더**를 변경하여 크게 만듭니다. 그런 다음 이 청크를 **해제**하여 가짜 크기의 tcache 청크에 추가합니다. 그런 다음 가짜 크기로 청크를 할당하고 이전 청크가 실제로 더 작았음을 알고 **다음 청크를 덮어쓸 수 있는 기회**를 얻습니다.\
이를 악용하여 **다음 청크의 FD 포인터를 덮어쓰기**하여 **`malloc_hook`**을 가리키도록 만들어 첫 번째로 수정한 합법적인 포인터를 할당하고, 두 번째 할당은 **`malloc_hook`**에 청크를 반환하여 **원 가젯을 작성할 수 있는** 기회를 제공합니다.
* **Libc 정보 누출**: 사용 후 무료 및 이중 무료가 있습니다. 이 글에서 작성자는 작은 bin에 배치된 청크의 주소를 읽어 libc 주소를 유출했습니다 (unsorted bin에서 누출하는 것처럼 작은 bin에서 누출).
* **Tcache 공격**: **이중 해제**를 통해 Tcache가 수행됩니다. 동일한 청크가 두 번 해제되므로 Tcache 내에서 청크가 자신을 가리킵니다. 그런 다음 할당되고 FD 포인터가 수정되어 **free 후크를 가리키도록**하고 다시 할당되어 목록의 다음 청크가 free 후크에 있게됩니다. 그런 다음 이것도 할당되어 `system` 주소를 여기에 쓸 수 있으므로 `"/bin/sh"`를 포함하는 malloc이 해제될 때 쉘을 얻을 수 있습니다.
* 여기서 주요 취약점은 오프셋을 지정하여 힙에서 **모든 주소를 `free`**할 수 있는 능력입니다.
* **Tcache 인덱스 공격**: tcache 청크(각 bin의 청크 수를 저장하는 청크)에 저장될 때 **값이 0x100인 주소를 생성하는 크기의 청크를 할당하고 해제**할 수 있습니다. 이는 tcache가 각 bin의 청크 수를 다른 바이트에 저장하기 때문에 특정 인덱스의 한 청크가 값 0x100을 생성합니다.
* 그런 다음 이 값은 크기가 0x100인 청크가 있는 것처럼 보입니다. 이 주소를 `free`하여 해당 주소를 tcache의 크기가 0x100인 청크 인덱스에 추가할 수 있습니다.
* 그런 다음 크기가 **0x100인 청크를 할당**하면 이전 주소가 청크로 반환되어 다른 tcache 인덱스를 덮어쓸 수 있습니다.\
예를 들어 malloc 후크의 주소를 하나에 넣고 해당 인덱스의 크기로 청크를 할당하면 calloc 후크에 청크가 제공되어 원 가젯을 작성할 수 있습니다.
* **Tcache 인덱스 공격**: 이전 공격과 유사하지만 **tcache 정보를 포함하는 청크를 해제**하여 해당 주소가 해당 크기의 tcache 인덱스에 추가되어 해당 크기를 할당하고 tcache 청크 정보를 얻을 수 있으므로 free 후크를 하나의 인덱스 주소로 추가하고 할당하여 원 가젯을 작성할 수 있습니다.