# Tcache Bin Attack {{#include ../../banners/hacktricks-training.md}} ## Temel Bilgiler Tcache bin nedir hakkında daha fazla bilgi için bu sayfayı kontrol edin: {{#ref}} bins-and-memory-allocations.md {{#endref}} Öncelikle, Tcache'in Glibc sürüm 2.26'da tanıtıldığını unutmayın. **Tcache saldırısı** (aynı zamanda **Tcache zehirlenmesi** olarak da bilinir) [**guyinatuxido sayfasında**](https://guyinatuxedo.github.io/29-tcache/tcache_explanation/index.html) önerilen, bir hızlı bin saldırısına çok benzer; burada amaç, serbest bırakılmış bir parçadaki bin içindeki bir sonraki parçanın işaretçisini rastgele bir adrese yazmaktır, böylece daha sonra **o belirli adresi ayırmak ve potansiyel olarak işaretçileri yazmak** mümkündür. Ancak, günümüzde, belirtilen kodu çalıştırırsanız, **`malloc(): unaligned tcache chunk detected`** hatasını alırsınız. Bu nedenle, yeni işaretçide yazılacak adresin hizalanmış bir adres olması gerekmektedir (veya yazılan adresin gerçekten hizalanmış olması için ikiliyi yeterince kez çalıştırmak). ### Tcache indeksleri saldırısı Genellikle, yığın başlangıcında tcache içindeki **indeks başına parça sayısını** ve **her tcache indeksinin baş parçasının adresini** içeren bir parça bulmak mümkündür. Eğer bu bilgiyi değiştirmek mümkün olursa, **bazı indekslerin baş parçasını istenen bir adrese** (örneğin `__malloc_hook`) işaret edecek şekilde ayarlamak mümkün olacaktır, böylece indeks boyutunda bir parça ayırabilir ve bu durumda `__malloc_hook` içeriğini yazabiliriz. ## Örnekler - CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html) - **Libc bilgi sızıntısı**: Tcache'leri doldurmak, düzensiz listeye bir parça eklemek, tcache'i boşaltmak ve **düzensiz bin'den parçayı yeniden ayırmak** mümkündür; sadece ilk 8B'yi yazarak, parçanın **ikinci adresini libc'den sağlam tutarak okuyabiliriz**. - **Tcache saldırısı**: İkili, 1B yığın taşması için savunmasızdır. Bu, bir ayrılmış parçanın **boyut başlığını** değiştirerek daha büyük hale getirmek için kullanılacaktır. Ardından, bu parça **serbest bırakılacak**, sahte boyutun tcache'ine eklenecektir. Sonra, sahte boyutta bir parça ayıracağız ve önceki parça **bu parçanın aslında daha küçük olduğunu bilerek dönecektir** ve bu, **bellekteki bir sonraki parçayı yazma fırsatını sağlar**.\ Bunu, **bir sonraki parçanın FD işaretçisini** **`malloc_hook`**'a işaret edecek şekilde yazmak için kullanacağız, böylece iki işaretçi ayırmak mümkün olacaktır: önce değiştirdiğimiz geçerli işaretçi, ardından ikinci ayırma **`malloc_hook`**'ta bir parça döndürecektir; bu, bir **one gadget** yazmak için istismar edilebilir. - CTF [https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html) - **Libc bilgi sızıntısı**: Bir serbest bırakma sonrası kullanım ve çift serbest bırakma vardır. Bu yazımda yazar, küçük bir bin içinde yer alan bir parçanın adresini okuyarak libc'nin bir adresini sızdırdı (düzensiz bin'den sızdırmak gibi ama küçük olanından). - **Tcache saldırısı**: Bir Tcache, **çift serbest bırakma** yoluyla gerçekleştirilir. Aynı parça iki kez serbest bırakılır, bu nedenle Tcache içinde parça kendisine işaret eder. Ardından, ayrılır, FD işaretçisi **serbest bırakma kancası**'na işaret edecek şekilde değiştirilir ve sonra tekrar ayrılır, böylece listedeki bir sonraki parça serbest bırakma kancasında olacaktır. Ardından, bu da ayrılır ve burada `system` adresini yazmak mümkündür, böylece `"/bin/sh"` içeren bir malloc serbest bırakıldığında bir shell alırız. - CTF [https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html](https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html) - Buradaki ana zafiyet, yığın içinde herhangi bir adresi `free` etme kapasitesidir; ofsetini belirterek. - **Tcache indeksleri saldırısı**: Tcache parça bilgisi içinde depolandığında, **0x100 değeri ile bir adres** üretecek bir boyutta bir parça ayırmak ve serbest bırakmak mümkündür. Bu, tcache'in her bin içindeki parça sayısını farklı baytlarda depolamasından kaynaklanmaktadır; bu nedenle, belirli bir indekste bir parça 0x100 değerini üretir. - Ardından, bu değer, 0x100 boyutunda bir parça varmış gibi görünür. Bu, bu adresi `free` ederek istismar etmeyi sağlar. Bu, **o adresi tcache'deki 0x100 boyutundaki parçaların indeksine ekleyecektir**. - Sonra, **0x100 boyutunda** bir parça **ayırarak**, önceki adres bir parça olarak dönecek ve diğer tcache indekslerini yazmayı sağlayacaktır.\ Örneğin, malloc kancası adresini bunlardan birine koymak ve o indeksin boyutunda bir parça ayırmak, calloc kancasında bir parça almayı sağlayacak; bu da bir one gadget yazmayı mümkün kılacaktır ve bir shell almayı sağlar. - CTF [https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html](https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html) - Öncekiyle aynı zafiyet, ancak bir ekstra kısıtlama ile. - **Tcache indeksleri saldırısı**: Öncekiyle benzer bir saldırı, ancak **tcache bilgilerini içeren parçayı serbest bırakarak** daha az adım kullanarak gerçekleştirilir; böylece adresi kendi boyutunun tcache indeksine eklenir, böylece o boyutu ayırmak ve tcache parça bilgilerini bir parça olarak almak mümkündür; bu, serbest bırakma kancasını bir indeksin adresi olarak eklemeyi, ayırmayı ve üzerine bir one gadget yazmayı sağlar. - [**Math Door. HTB Cyber Apocalypse CTF 2023**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/math-door/) - `fd` işaretçisine bir sayı eklemek için **Write After Free**. - Bu zorlukta çok fazla **heap feng-shui** gereklidir. Yazım, **Tcache** serbest liste başını kontrol etmenin oldukça kullanışlı olduğunu göstermektedir. - `stdout` üzerinden **Glibc sızıntısı** (FSOP). - **Tcache zehirlenmesi** ile rastgele bir yazma ilkesine ulaşmak. {{#include ../../banners/hacktricks-training.md}}