Basic Binary Exploitation Methodology
ELF Temel Bilgileri
Herhangi bir şeyi sömürmeye başlamadan önce bir ELF ikilisinin yapısının bir kısmını anlamak ilginç olabilir:
Sömürü Araçları
Yığın Taşması Metodolojisi
Bu kadar teknikle birlikte her teknik ne zaman kullanışlı olacak bir şema olması iyidir. Aynı korumalar farklı teknikleri etkileyecektir. Korumaları atlatma yollarını her koruma bölümünde bulabilirsiniz ancak bu metodolojide değil.
Akışı Kontrol Etme
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 Yürütme yoluyla
Biçim dizeleri:
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 Yürütme tekniklerini şurada bulabilirsiniz:
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 atlatılması gerekebilir. Bu nedenle, aynı yürütmede bir zafiyeti birden fazla 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 yazın (veya bitmeden önce kullanılan başka bir işlev) zafiyete geri dönmek için adresi.fini_array** açıklamasında belirtildiği gibi**, buraya 2 işlev saklayın, biri zafiyeti tekrar çağırmak için diğeri
.fini_array
işlevini tekrar çağıracak olan**__libc_csu_fini
** işlevini çağırmak için.
Sömürü Hedefleri
Hedef: Varolan bir işlevi Çağırmak
ret2win: Çağırmanız gereken bir işlev (belki belirli parametrelerle) varsa 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 kullanarak diğer zafiyetleri (bof olmayanlar) kötüye kullanarak
win
işlevini çağırabilirsiniz.İşaretçileri Yönlendirme: Yığında, çağrılacak bir işlevin işaretçilerini veya bir işlev tarafından kullanılacak bir dizeye işaretçiler varsa, o adresi üzerine yazabilirsiniz.
İlklenmemiş değişkenler: Asla bilemezsiniz.
Hedef: Uzaktan Kod Yürütme (RCE)
Nx devre dışı bırakılmışsa veya shellcode ile ROP karıştırılıyorsa:
(Yığın) Shellcode: Bu, bir shellcode'u yığında depolamak ve ardından dönüş işaretçisini üzerine yazarak 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 gerekecektir
ASLR ile, ona atlamak için ret2esp/ret2reg gibi teknikler gerekecektir
Bu, shellcode'u bir ROP zinciri ile karıştıracaktır.
Syscall Yoluyla
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 faydalı olabilir
Libc Aracılığıyla
Ret2lib: Genellikle
libc
gibi bir kütüphaneden bir fonksiyonu (genelliklesystem
) çağırmak için kullanışlıdır ve bazı hazırlanmış argümanlarla (ör.'/bin/sh'
). Çağırmak istediğiniz fonksiyonun kütüphaneyi yüklemesi gerekmektedir (genellikle libc).Statik olarak derlenmiş ve PIE etkin değilse,
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ü libc sürümünü bildiğinizde,
system
ve/bin/sh
'nin adresleri değişmeyecek, bu yüzden bunları statik olarak kullanmak mümkün olacaktır.ret2dlresolve
'yi kullanaraksystem
'in adresini çözümlemek ve çağırmak içinASLR geçmek ve bellekteki
system
ve'/bin/sh'
adreslerini hesaplamak.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.
EBP/RBP Aracılığıyla
Stack Pivoting / EBP2Ret / EBP Chaining: ESP'yi kontrol ederek stack'teki depolanan EBP aracılığıyla RET'i kontrol etmek.
Off-by-one stack taşmaları için kullanışlı
EIP'yi kontrol etmeyi sonlandırmak için alternatif bir yol olarak kullanışlıdır, EIP'yi hafızada payload oluşturmak için kötüye kullanarak ve ardından EBP aracılığıyla ona atlayarak.
Çeşitli
Pointers Redirecting: Stack'te çağrılacak bir fonksiyonun veya ilginç bir fonksiyon tarafından kullanılacak bir dizeye işaret eden işaretçiler varsa, o adresi üzerine yazmak mümkündür.
İlklenmemiş değişkenler: Asla bilemezsiniz
Last updated