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

5.4 KiB

Tcache Bin Attack

htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요

HackTricks를 지원하는 다른 방법:

기본 정보

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

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

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

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

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

Tcache 인덱스 공격

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

예시

  • 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 정보 누출: use after free 및 double free가 있습니다. 이 writeup에서 작성자는 작은 bin에 배치된 청크의 주소를 읽어 libc 주소를 유출했습니다 (unsorted bin이 아닌 작은 bin에서 유출).
  • Tcache 공격: 이중 해제를 통해 Tcache가 수행됩니다. 동일한 청크가 두 번 해제되므로 Tcache 내에서 해당 청크는 자신을 가리킵니다. 그런 다음 할당되고, FD 포인터가 수정되어 free 후크를 가리키도록하고 다시 할당되어 목록의 다음 청크가 free 후크에 있게됩니다. 그런 다음 이것도 할당되어 system 주소를 여기에 쓸 수 있으므로 "/bin/sh"를 포함하는 malloc이 해제되면 쉘을 얻을 수 있습니다.
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html
  • Tcache 인덱스 공격: tcache 정보에 저장된 크기의 청크를 할당하고 해제하여 값이 0x100인 위치를 생성할 수 있습니다 (해당 인덱스에 저장된 청크 수를 나타내는 바이트 때문에). 이 값을 악용하여 0x100 크기의 청크로 할당하면 다른 tcache 인덱스의 초기 청크 주소를 덮어쓸 수 있습니다. 예를 들어 그 중 하나에 malloc 후크 주소를 넣고 해당 인덱스의 크기로 청크를 할당하면 calloc 후크에 청크가 제공되어 원 가젯을 작성하여 쉘을 얻을 수 있습니다.