hacktricks/binary-exploitation/libc-heap/tcache-bin-attack.md

8.1 KiB

Tcache Bin Attack

{% hint style="success" %} AWS 해킹 학습 및 실습:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 학습 및 실습: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원
{% endhint %}

기본 정보

Tcache bin이 무엇인지에 대한 자세한 정보는 다음 페이지를 확인하세요:

{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}

먼저, Tcache는 Glibc 버전 2.26에서 소개되었음을 유의하십시오.

guyinatuxido 페이지에서 제안된 Tcache 공격(또는 Tcache 독성)은 목표가 해제된 청크 내부의 bin 안의 다음 청크를 가리키는 포인터를 임의의 주소로 덮어쓰기하여 나중에 해당 특정 주소를 할당하고 포인터를 덮어쓸 수 있도록하는 빠른 bin 공격과 매우 유사합니다.

그러나 현재는 해당 코드를 실행하면 오류가 발생합니다: malloc(): unaligned tcache chunk detected. 따라서 새 포인터에 정렬된 주소를 쓰거나 (또는 쓴 주소가 실제로 정렬되도록 이진을 충분히 실행)해야합니다.

Tcache 인덱스 공격

일반적으로 힙의 시작 부분에는 tcache 내의 인덱스 당 청크 수를 포함하고 있으며 각 tcache 인덱스의 헤드 청크 주소를 포함하는 청크가 있습니다. 이 정보를 수정할 수 있는 이유가 있다면, 일부 인덱스의 헤드 청크를 원하는 주소(예: __malloc_hook)를 가리키도록 만들 수 있습니다. 그런 다음 해당 인덱스의 크기의 청크를 할당하고 이 경우 __malloc_hook의 내용을 덮어쓸 수 있습니다.

예시

  • CTF https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html
  • Libc 정보 누출: tcache를 채우고, unsorted 리스트에 청크를 추가하고, tcache를 비우고 unsorted bin에서 청크를 다시 할당하여 처음 8B만 덮어쓰고 두 번째 주소를 청크에서 libc로 읽을 수 있도록 남깁니다.
  • Tcache 공격: 바이너리가 1B 힙 오버플로우에 취약합니다. 이를 악용하여 할당된 청크의 크기 헤더를 변경하여 크게 만듭니다. 그런 다음 이 청크를 해제하여 가짜 크기의 tcache 청크에 추가합니다. 그런 다음, 가짜 크기로 청크를 할당하고 이전 청크가 실제로 더 작았음을 알고 이 청크가 메모리에서 다음 청크를 덮어쓸 수 있음을 보증합니다.
    이를 악용하여 다음 청크의 FD 포인터를 덮어쓰기하여 **malloc_hook**을 가리키도록 만들어, 수정한 정당한 포인터를 먼저 할당하고, 그 다음 할당은 **malloc_hook**에 청크를 반환하여 원 가젯을 작성할 수 있습니다.
  • CTF https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html
  • Libc 정보 누출: 사용 후 무료 및 이중 무료가 있습니다. 이 writeup에서 작성자는 작은 bin에 배치된 청크의 주소를 읽어 libc 주소를 누출했습니다 (unsorted bin에서 누출하는 것처럼 작은 bin에서 누출).
  • Tcache 공격: 이중 해제를 통해 Tcache가 수행됩니다. 동일한 청크가 두 번 해제되므로 Tcache 내에서 청크가 자신을 가리킵니다. 그런 다음 할당되고, FD 포인터가 수정되어 free hook을 가리키도록 만들어지고 다시 할당되어 목록의 다음 청크가 free hook에 있게됩니다. 그런 다음, 이것도 할당되어 system의 주소를 여기에 쓸 수 있으므로 "/bin/sh"를 포함하는 malloc이 해제되면 쉘을 얻을 수 있습니다.
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html
  • 여기서 주요 취약점은 오프셋을 지정하여 힙의 모든 주소를 free할 수 있는 능력입니다.
  • Tcache 인덱스 공격: tcache 청크에 저장된 크기를 가진 청크를 할당하고 해제하면 (tcache bin 정보를 포함하는 청크) 값이 0x100인 주소가 생성됩니다. 이는 tcache가 각 bin의 청크 수를 다른 바이트에 저장하기 때문에 특정 인덱스의 하나의 청크가 값 0x100을 생성합니다.
  • 그런 다음, 이 값은 크기가 0x100인 청크가 있는 것처럼 보입니다. 이 주소를 free하여 해당 주소를 tcache의 크기가 0x100인 청크 인덱스에 추가할 수 있습니다.
  • 그런 다음, 크기가 0x100인 청크를 할당하면 이전 주소가 청크로 반환되어 다른 tcache 인덱스를 덮어쓸 수 있습니다.
    예를 들어 malloc hook 주소를 그 중 하나에 넣고 해당 인덱스의 크기로 청크를 할당하면 calloc hook에 청크가 부여되어 원 가젯을 작성할 수 있습니다.
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html
  • 이전과 동일한 취약점이지만 추가 제한이 있습니다.
  • Tcache 인덱스 공격: 이전 공격과 유사하지만 tcache 정보를 포함하는 청크를 해제하여 해당 크기의 tcache 인덱스에 주소가 추가되어 해당 크기를 할당하고 tcache 청크 정보를 얻을 수 있으므로 free hook을 한 인덱스의 주소로 추가하고 할당하여 원 가젯을 작성할 수 있습니다.
  • Math Door. HTB Cyber Apocalypse CTF 2023
  • fd 포인터에 숫자를 추가하기 위해 Write After Free를 사용합니다.
  • 이 도전에서는 많은 힙 feng-shui가 필요합니다. Writeup에서는 Tcache free-list의 헤드를 제어하는 것이 매우 편리하다는 것을 보여줍니다.
  • stdout를 통한 Glibc 누출 (FSOP).
  • 임의 쓰기 원시를 얻기 위한 Tcache 독성.

{% hint style="success" %} AWS 해킹 학습 및 실습:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 학습 및 실습: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원