mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
94 lines
4.3 KiB
Markdown
94 lines
4.3 KiB
Markdown
# 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}}
|