112 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Temel İkili Sömürü Metodolojisi
{{#include ../../banners/hacktricks-training.md}}
## ELF Temel Bilgiler
Herhangi bir şeyi sömürmeye başlamadan önce, bir **ELF ikilisi** yapısının bir kısmını anlamak ilginçtir:
{{#ref}}
elf-tricks.md
{{#endref}}
## Sömürü Araçları
{{#ref}}
tools/
{{#endref}}
## Yığın Taşması Metodolojisi
Bu kadar çok teknikle, her tekniğin ne zaman faydalı olacağına dair bir şemaya sahip olmak iyidir. Aynı korumaların farklı teknikleri etkileyeceğini unutmayın. Her koruma bölümünde korumaları aşmanın yollarını bulabilirsiniz, ancak bu metodolojide değil.
## Akışı Kontrol Etme
Bir programın akışını kontrol etmenin farklı yolları vardır:
- [**Yığın Taşmaları**](../stack-overflow/index.html) yığından dönüş işaretçisini veya EBP -> ESP -> EIP'yi yazmak.
- Taşmayı sağlamak için bir [**Tam Sayı Taşması**](../integer-overflow.md) istismar etmeniz gerekebilir.
- Ya da **Rastgele Yazmalar + Yaz Nereye İcra** yoluyla.
- [**Format dizeleri**](../format-strings/index.html)**:** `printf`'i kullanarak rastgele içeriği rastgele adreslere yazmak.
- [**Dizi İndeksleme**](../array-indexing.md): Bazı dizileri kontrol edebilmek ve rastgele yazma elde edebilmek için kötü tasarlanmış bir indekslemeyi istismar etmek.
- Taşmayı sağlamak için bir [**Tam Sayı Taşması**](../integer-overflow.md) istismar etmeniz gerekebilir.
- **bof'dan WWW'ye ROP ile**: Bir tampon taşmasını istismar ederek bir ROP oluşturmak ve WWW'ye ulaşmak.
**Yaz Nereye İcra** tekniklerini şurada bulabilirsiniz:
{{#ref}}
../arbitrary-write-2-exec/
{{#endref}}
## Sonsuz Döngüler
Dikkate alınması gereken bir şey, genellikle **bir zafiyetin sadece bir kez sömürülmesinin yeterli olmayabileceğidir**; özellikle bazı korumaların aşılması gerekir. Bu nedenle, bir **tek zafiyeti aynı ikilinin yürütülmesi sırasında birkaç kez sömürülebilir hale getirmek** için bazı seçenekleri tartışmak ilginçtir:
- **`main` fonksiyonunun** adresini veya **zafiyetin** meydana geldiği adresi bir **ROP** zincirine yazmak.
- Uygun bir ROP zincirini kontrol ederek, o zincirdeki tüm eylemleri gerçekleştirebilirsiniz.
- **`exit` adresini GOT'ta** (veya ikili tarafından bitirilmeden önce kullanılan herhangi bir fonksiyonda) **zafiyete geri dönmek** için yazmak.
- [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**'de** açıklandığı gibi, burada zafiyeti tekrar çağıracak bir fonksiyon ve **`__libc_csu_fini`** fonksiyonunu çağıracak başka bir fonksiyon saklamak.
## Sömürü Hedefleri
### Hedef: Mevcut bir fonksiyonu çağırmak
- [**ret2win**](#ret2win): Bayrağı almak için çağırmanız gereken (belki bazı özel parametrelerle) kodda bir fonksiyon var.
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **ve** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html) olmayan bir **normal bof'da**, yığındaki saklanan dönüş adresine sadece adresi yazmanız yeterlidir.
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) olan bir bof'da, bunu aşmanız gerekecek.
- [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html) olan bir bof'da, bunu aşmanız gerekecek.
- **ret2win** fonksiyonunu doğru bir şekilde çağırmak için birkaç parametre ayarlamanız gerekiyorsa:
- Tüm parametreleri hazırlamak için yeterli gadget varsa bir [**ROP**](#rop-and-ret2...-techniques) **zinciri** kullanabilirsiniz.
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) (bu syscall'ı çağırabiliyorsanız) birçok kaydı kontrol etmek için.
- [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) ve [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) ile birkaç kaydı kontrol etmek için gadget'lar.
- [**Yaz Nereye**](../arbitrary-write-2-exec/index.html) ile, **`win`** fonksiyonunu çağırmak için diğer zafiyetleri (bof değil) istismar edebilirsiniz.
- [**İşaretçi Yönlendirme**](../stack-overflow/pointer-redirecting.md): Yığın, çağrılacak bir fonksiyona veya ilginç bir fonksiyon (system veya printf) tarafından kullanılacak bir dizeye işaret eden işaretçiler içeriyorsa, o adresi yazmak mümkündür.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) veya [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) adresleri etkileyebilir.
- [**Başlatılmamış değişkenler**](../stack-overflow/uninitialized-variables.md): Asla bilemezsiniz.
### Hedef: RCE
#### Shellcode aracılığıyla, eğer nx devre dışıysa veya shellcode'u ROP ile karıştırıyorsanız:
- [**(Yığın) Shellcode**](#stack-shellcode): Bu, dönüş işaretçisini yazmadan önce veya sonra yığında bir shellcode saklamak ve ardından **ona atlamak** için yararlıdır:
- Her durumda, eğer bir [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)** varsa**, normal bir bof'da bunu aşmanız (sızdırmanız) gerekecek.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **ve** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) olmadan, yığın adresine atlamak mümkündür çünkü asla değişmeyecektir.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) ile, ona atlamak için [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md) gibi tekniklere ihtiyacınız olacak.
- [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) ile, bazı [**ROP**](../rop-return-oriented-programing/index.html) **kullanarak `memprotect` çağırmanız** ve bazı sayfaları `rwx` yapmanız gerekecek, böylece **shellcode'u oraya saklayabilir** (örneğin read çağırarak) ve ardından oraya atlayabilirsiniz.
- Bu, shellcode'u bir ROP zinciri ile karıştıracaktır.
#### Syscall'lar aracılığıyla
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html): Rastgele komutları çalıştırmak için `execve` çağırmak için yararlıdır. **Belirli syscall'ı parametrelerle çağırmak için gadget'ları bulabilmeniz gerekir.**
- Eğer [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) veya [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) etkinse, **ROP gadget'larını kullanmak için bunları aşmanız gerekecek.**
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) **ret2execve'yi** hazırlamak için yararlı olabilir.
- [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) ve [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) ile birkaç kaydı kontrol etmek için gadget'lar.
#### libc aracılığıyla
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): Genellikle **`libc`**'den bir fonksiyonu (örneğin **`system`**) bazı hazırlanmış argümanlarla (örneğin `'/bin/sh'`) çağırmak için yararlıdır. Çağırmak istediğiniz fonksiyonla birlikte **kütüphaneyi yüklemek** için ikiliyi **yüklemeniz gerekir** (genellikle libc).
- **Statik derlenmiş ve** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) yoksa, `system` ve `/bin/sh`'nin **adresleri** değişmeyecek, bu nedenle bunları statik olarak kullanmak mümkündür.
- **ASLR** olmadan **ve yüklü libc sürümünü bilerek**, `system` ve `/bin/sh`'nin **adresleri** değişmeyecek, bu nedenle bunları statik olarak kullanmak mümkündür.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **ama** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) yoksa, libc'yi bilerek ve ikili `system`** fonksiyonunu kullanıyorsa, **GOT'taki system adresine `ret` yaparak** `'/bin/sh'` adresini parametre olarak kullanmak mümkündür (bunu çözmeniz gerekecek).
- [ASLR](../common-binary-protections-and-bypasses/aslr/index.html) ama [PIE](../common-binary-protections-and-bypasses/pie/index.html) yoksa, libc'yi bilerek ve **ikili `system`** kullanmıyorsanız:
- [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md) kullanarak `system` adresini çözmek ve çağırmak.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **aşmak** ve `system` ve `'/bin/sh'` adreslerini bellek içinde hesaplamak.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **ve** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **ve libc'yi bilmeden**: Şunları yapmanız gerekir:
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) aşmak.
- Kullanılan **`libc` sürümünü** bulmak (birkaç fonksiyon adresini sızdırmak).
- Devam etmek için **ASLR ile önceki senaryoları** kontrol etmek.
#### EBP/RBP aracılığıyla
- [**Yığın Pivotlama / EBP2Ret / EBP Zincirleme**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Yığındaki saklanan EBP aracılığıyla RET'i kontrol etmek için ESP'yi kontrol edin.
- **Birden fazla** yığın taşmaları için yararlıdır.
- Yüklemenin bellek içinde yüklenmesini sağlarken EIP'yi kontrol etmenin alternatif bir yolu olarak yararlıdır ve ardından EBP aracılığıyla ona atlayabilirsiniz.
#### Çeşitli
- [**İşaretçi Yönlendirme**](../stack-overflow/pointer-redirecting.md): Yığın, çağrılacak bir fonksiyona veya ilginç bir fonksiyon (system veya printf) tarafından kullanılacak bir dizeye işaret eden işaretçiler içeriyorsa, o adresi yazmak mümkündür.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) veya [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) adresleri etkileyebilir.
- [**Başlatılmamış değişkenler**](../stack-overflow/uninitialized-variables.md): Asla bilemezsiniz.
{{#include ../../banners/hacktricks-training.md}}