# Force Evi
{% hint style="success" %}
AWS Hacking'i öğrenin ve uygulayın:[**HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
GCP Hacking'i öğrenin ve uygulayın: [**HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)**](https://training.hacktricks.xyz/courses/grte)
HackTricks'i Destekleyin
* [**Abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) katılın veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Hacking püf noktalarını paylaşarak PR'ler göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
{% endhint %}
## Temel Bilgiler
### Kod
* Bu teknik düzeltildi ([**burada**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=30a17d8c95fbfb15c52d1115803b63aaa73a285c)) ve şu hatayı üretir: `malloc(): corrupted top size`
* Test etmek isterseniz [**buradan kodu**](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html) deneyebilirsiniz.
### Amaç
* Bu saldırının amacı belirli bir adreste bir parça tahsis edebilmektir.
### Gereksinimler
* Başlık üst parçasının boyutunu üzerine yazmanızı sağlayan bir taşma (örneğin -1).
* Yığın tahsis boyutunu kontrol edebilme yeteneği
### Saldırı
Bir saldırgan, bir değeri buraya yazmak için bir parça tahsis etmek isterse, işe `-1` ile başlık üst parçasını üzerine yazarak başlar (belki bir taşma ile). Bu, malloc'un Top parçasının her zaman yeterli alanı olacağından mmap'ı herhangi bir tahsis için kullanmayacağını sağlar.
Ardından, başlık üst parçasının adresi ile hedef alan arasındaki mesafeyi hesaplayın. Bu, başlık üst parçasını o konuma taşımak için o boyutta bir malloc işlemi gerçekleştirileceğinden fark/mesafe kolayca hesaplanabilir. Bu, farkın/boyutun nasıl kolayca hesaplanabileceğidir:
```c
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/
```
Bu nedenle, `hedef - eski_üst - 4*sizeof(long)` boyutunda bir alan ayırmak (4 long, üst parçanın ve ayrıldığında yeni parçanın meta verileri nedeniyle) üst parçayı üzerine yazmak istediğimiz adrese taşıyacaktır.\
Ardından, hedef adreste bir parça almak için başka bir malloc yapın.
### Referanslar ve Diğer Örnekler
* [https://github.com/shellphish/how2heap/tree/master](https://github.com/shellphish/how2heap/tree/master?tab=readme-ov-file)
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/)
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_force](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_force)
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c)
* [https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html)
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11)
* Bu senaryonun amacı, çağrılacak bir işlevin adresini ret2win işlevinin adresine değiştirmemiz gereken bir ret2win'dir
* İkili dosyanın, üst parçanın boyutunu değiştirmek için kötüye kullanılabilecek bir taşma sorunu vardır, bu da -1 veya p64(0xffffffffffffffff) olarak değiştirilir
* Daha sonra, üzerine yazılacak işaretçinin bulunduğu yere giden adres hesaplanır ve üst parçanın mevcut konumundan oraya olan fark `malloc` ile ayrılır
* Son olarak, istenen hedefi içerecek yeni bir parça ayrılır ve bu parça ret2win işlevi tarafından üzerine yazılır
* [https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp](https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp)
* `Adınızı girin:` alanında, yığından bir adres sızdırmaya izin veren başlangıçta bir zayıflık vardır
* Ardından, `Org:` ve `Host:` işlevlerinde, **org adı** istendiğinde `s` işaretçisinin 64B'sini doldurmak mümkündür, bu da yığında v2 adresini takip eden ve daha sonra belirtilen **ana bilgisayar adını** takip eden verileri kopyalayacak olan strcpy'nin içeriğini **üst parçanın boyutunu üzerine yazmak** mümkündür.
* Artık keyfi yazma mümkün olduğundan, `atoi`'nin GOT'u printf adresine üzerine yazılmıştır. Ardından, `IO_2_1_stderr` adresi `%24$p` ile sızdırılabildi ve bu libc sızıntısı ile `atoi`'nin GOT'u tekrar `system` adresiyle üzerine yazılarak `/bin/sh` parametresiyle çağrılabildi
* [Bu diğer yazıda önerilen](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#2016-bctf-bcloud) alternatif bir yöntem, `free`'yi `puts` ile üzerine yazmak ve ardından daha sonra serbest bırakılacak işaretçiye `atoi@got` adresini eklemektir, böylece sızdırılır ve bu sızıntı ile tekrar `atoi@got` adresi `system` ile üzerine yazılır ve `/bin/sh` ile çağrılır.
* [https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html)
* Serbest bırakılan ancak işaretçi temizlenmeden tekrar kullanılmasına izin veren bir UAF vardır. Bazı okuma yöntemleri olduğundan, burada GOT'a serbest işlevine bir işaretçi yazarak bir libc adresi sızdırmak ve ardından okuma işlevini çağırmak mümkündür.
* Ardından, (UAF'yi kötüye kullanarak) sol boşluğun boyutu -1 ile üzerine yazılarak House of force kullanıldı, serbest kancaya ulaşmak için yeterince büyük bir parça ayrıldı ve ardından serbest kancayı içerecek başka bir parça ayrıldı. Ardından, kancaya `system` adresi yazılır, bir parçaya `"/bin/sh"` yazılır ve son olarak bu dize içeriğine sahip parça serbest bırakılır.