Basic Stack Binary Exploitation Methodology
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Herhangi bir şeyi sömürmeye başlamadan önce, bir ELF ikilisi yapısının bir kısmını anlamak ilginçtir:
ELF Basic InformationBu 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.
Bir programın akışını kontrol etmenin farklı yolları vardır:
Yığın Taşmaları yığından dönüş işaretçisini veya EBP -> ESP -> EIP'yi yazma.
Taşmayı sağlamak için bir Tam Sayı Taşması istismar etmeniz gerekebilir.
Ya da Rastgele Yazmalar + Yazılacak Ne Nerede ile.
Format dizeleri: printf
'i istendiği gibi içerik yazmak için istismar etme.
Dizi İndeksleme: Bazı dizileri kontrol edebilmek ve rastgele yazma elde edebilmek için kötü tasarlanmış bir indekslemeyi istismar etme.
Taşmayı sağlamak için bir Tam Sayı Taşması istismar etmeniz gerekebilir.
bof'dan WWW'ye ROP ile: Bir tampon taşmasını istismar ederek bir ROP oluşturma ve WWW'ye ulaşma.
Yazılacak Ne Nerede tekniklerini bulabilirsiniz:
Write What Where 2 ExecDikkate alınması gereken bir şey, genellikle bir zafiyetin yalnızca 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 yazın.
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 adresi yazın.
.fini_array'de açıklandığı gibi, burada zafiyeti tekrar çağırmak için bir fonksiyon ve __libc_csu_fini
fonksiyonunu çağırmak için başka bir fonksiyon saklayın; bu da .fini_array
'dan fonksiyonu tekrar çağıracaktır.
ret2win: Bayrağı almak için çağırmanız gereken (belki bazı özel parametrelerle) kodda bir fonksiyon var.
PIE olan bir bof'da, bunu aşmanız gerekecek.
canary olan bir bof'da, bunu aşmanız gerekecek.
ret2win fonksiyonunu doğru bir şekilde çağırmak için birkaç parametre ayarlamanız gerekiyorsa, şunları kullanabilirsiniz:
Tüm parametreleri hazırlamak için yeterli gadget varsa bir ROP zinciri.
Birçok kaydı kontrol etmek için SROP (bu syscall'ı çağırabiliyorsanız).
Yazılacak Ne Nerede aracılığıyla, win
fonksiyonunu çağırmak için diğer zafiyetleri (bof olmayan) istismar edebilirsiniz.
İşaretçi Yönlendirme: Yığın, çağrılacak bir fonksiyona veya ilginç bir fonksiyon (system veya printf) tarafından kullanılacak bir dizeye işaretçi içeriyorsa, o adresi yazmak mümkündür.
Başlatılmamış değişkenler: Asla bilemezsiniz.
(Yığın) 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 varsa, normal bir bof'da bunu aşmanız gerekecek (sızdırmak).
ASLR ile, ona atlamak için ret2esp/ret2reg gibi tekniklere ihtiyacınız olacak.
Bu, shellcode ile bir ROP zincirini karıştıracaktır.
Ret2syscall: 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.
SROP ret2execve'yi hazırlamak için yararlı olabilir.
Ret2lib: Genellikle libc
'den bir fonksiyonu (örneğin system
ile bazı hazırlanan argümanlarla) çağırmak için yararlıdır (örneğin '/bin/sh'
). Çağırmak istediğiniz fonksiyonla birlikte kütüphaneyi yüklemek için ikiliyi gerektirir (genellikle libc).
Statik derlenmiş ve PIE 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.
ret2dlresolve
kullanarak system
adresini çözmek ve çağırmak.
ASLR aşmak ve system
ve '/bin/sh'
adreslerini bellek içinde hesaplamak.
PIE 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.
Yığın Pivotlama / EBP2Ret / EBP Zincirleme: Yığın üzerindeki EBP'yi kontrol ederek RET'i kontrol etmek.
Birden fazla yığın taşmalarında yararlıdır.
Yüklemenin bellek içinde payload'u oluştururken EIP'i istismar ederek EIP'i kontrol etmenin alternatif bir yolu olarak yararlıdır ve ardından EBP aracılığıyla ona atlayabilirsiniz.
İşaretçi Yönlendirme: Yığın, çağrılacak bir fonksiyona veya ilginç bir fonksiyon (system veya printf) tarafından kullanılacak bir dizeye işaretçi içeriyorsa, o adresi yazmak mümkündür.
Başlatılmamış değişkenler: Asla bilemezsiniz.
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)