Basic Stack Binary Exploitation Methodology
Last updated
Last updated
AWS Hacking'i öğrenin ve uygulayın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Herhangi bir şeyi sömürmeye başlamadan önce bir ELF ikilisinin yapısının bir kısmını anlamak ilginç olabilir:
ELF Basic InformationBu kadar teknikle, her tekniğin ne zaman kullanışlı olacağını belirlemek için bir plana sahip olmak iyidir. Aynı korumaların farklı teknikleri etkileyeceğini unutmayın. Her koruma bölümünde korumaları atlatma yollarını bulabilirsiniz, ancak bu metodolojide değil.
Bir programın akışını kontrol etmenin farklı yolları olabilir:
Yığın Taşmaları: Yığından dönüş işaretçisini veya EBP -> ESP -> EIP'yi üzerine yazarak.
Taşmayı tetiklemek için bir Tamsayı Taşmaları kullanmanız gerekebilir
Veya Keyfi Yazma + Ne Nerede Yazma ile Yürütme
Biçim Dizileri: printf
'i kötüye kullanarak keyfi içeriği keyfi adreslere yazmak.
Dizi İndeksleme: Kötü tasarlanmış bir dizinlemeyi kötüye kullanarak bazı dizileri kontrol edebilir ve keyfi yazma alabilirsiniz.
Taşmayı tetiklemek için bir Tamsayı Taşmaları kullanmanız gerekebilir
bof to WWW via ROP: Bir tampon taşmasını kötüye kullanarak bir ROP oluşturmak ve bir WWW almak için.
Ne Nerede Yazma ile Yürütme tekniklerini şurada bulabilirsiniz:
Write What Where 2 ExecDikkate alınması gereken bir şey genellikle bir zafiyetin sadece bir kez sömürülmesinin yeterli olmayabileceğidir, özellikle bazı korumaların atlatılması gerekebilir. Bu nedenle, bir zafiyeti aynı ikili çalıştırmada birkaç kez sömürülebilir hale getirmek için bazı seçenekleri tartışmak ilginçtir:
Bir ROP zincirine main
işlevinin adresini veya zafiyetin meydana geldiği adrese yazın.
Uygun bir ROP zincirini kontrol ederek o zincirdeki tüm işlemleri gerçekleştirebilirsiniz
exit
adresini GOT'a (veya bitmeden önce ikili tarafından kullanılan başka bir işlev) zafiyete geri dönmek için adresi yazın
.fini_array'de açıklandığı gibi, buraya 2 işlev saklayın, biri zafiyeti tekrar çağırmak için diğeri ise .fini_array
'dan işlevi tekrar çağıracak olan**__libc_csu_fini
**'yi çağırmak için.
ret2win: Çağırmanız gereken bir işlev var (belki belirli parametrelerle) bayrağı almak için.
PIE ile bir bof'ta, bunu atlatmanız gerekecektir
canary ile bir bof'ta, bunu atlatmanız gerekecektir
ret2win işlevini doğru şekilde çağırmak için birden fazla parametre ayarlamanız gerekiyorsa şunları kullanabilirsiniz:
Yeterli sayıda kısayol varsa ROP zinciri tüm parametreleri hazırlamak için
SROP (bu sistem çağrısını yapabiliyorsanız) birçok kaydı kontrol etmek için
Bir Ne Nerede Yazma ile başka zafiyetleri (bof olmayanlar) kötüye kullanarak win
işlevini çağırabilirsiniz.
İşaretçileri Yönlendirme: Yığın, çağrılacak bir işlevin işaretçilerini veya bir işlev tarafından kullanılacak bir dizeye işaret ediyorsa (system veya printf gibi), o adresi üzerine yazabilirsiniz.
İlklenmemiş değişkenler: Asla bilemezsiniz.
(Yığın) Shellcode: Bu, bir shellcode'u yığında depolamak ve ardından dönüş işaretçisini üzerine yazdıktan sonra ona atlamak ve çalıştırmak için kullanışlıdır:
Her durumda, bir canary** varsa,** düzenli bir bof'ta bunu atlatmanız (sızdırmanız) gerekecektir
ASLR ile, ona atlamak için ret2esp/ret2reg gibi tekniklere ihtiyacınız olacaktır
Bu, shellcode'u bir ROP zinciri ile karıştıracaktır.
Ret2syscall: Herhangi bir komutu çalıştırmak için execve
'yi çağırmak için kullanışlıdır. Belirli bir syscall'ı parametrelerle çağırmak için gerekli olan gadget'ları bulabilmelisiniz.
SROP ret2execve'yi hazırlamak için kullanışlı olabilir
Ret2lib: Genellikle libc
gibi bir kütüphaneden bir fonksiyonu (genellikle system
) çağırmak için kullanışlıdır ve bazı hazırlanmış argümanlarla (ör. '/bin/sh'
). Çağırmak istediğiniz fonksiyonu içeren kütüphanenin yüklenmiş olması gerekmektedir.
Statik olarak derlenmiş ve PIE olmayan durumlarda, system
ve /bin/sh
'nin adresleri değişmeyecek, bu yüzden bunları statik olarak kullanmak mümkün olacaktır.
ASLR olmadan [ve yüklü olan libc sürümünü bilerek, system
ve /bin/sh
'nin adresleri değişmeyecek, bu yüzden bunları statik olarak kullanmak mümkün olacaktır.
ret2dlresolve
'yi kullanarak system
'in adresini çözümlemek ve çağırmak mümkündür.
ASLR geçmek ve system
ve '/bin/sh'
'nin adresini hesaplamak için
PIE geçmek
Kullanılan libc
sürümünü bulmak (birkaç fonksiyon adresini sızdırmak)
Devam etmek için ASLR ile önceki senaryoları kontrol etmek gerekecek.
Stack Pivoting / EBP2Ret / EBP Chaining: ESP'yi kontrol ederek stack'te depolanan EBP aracılığıyla RET'i kontrol etmek.
Off-by-one stack overflow'lar için kullanışlıdır
EIP'yi kontrol etmeyi sonlandırmanın alternatif bir yol olarak kullanışlıdır, EIP'yi kontrol ederken bellekte payload'ı oluşturmak ve ardından EBP aracılığıyla ona atlamak için
Pointers Redirecting: Stack'te çağrılacak bir fonksiyonun adreslerini veya bir dizeyi içeren işlevin (system veya printf gibi) kullanılacağına dair işaretçiler varsa, o adresi üzerine yazmak mümkündür.
İlklenmemiş değişkenler: Asla bilemezsiniz