Basic Binary Exploitation Methodology

Sıfırdan kahraman olmak için AWS hackleme öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'ı desteklemenin diğer yolları:

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 olmadan ve canary ile birlikte düzenli bir bof'ta, yığında depolanan dönüş adresine adresi yazmanız yeterli olacaktır.

  • 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

  • ret2csu ve ret2vdso 'dan kısayolları 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.

  • ASLR veya PIE adresleri etkileyebilir.

  • İ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 ve nx olmadan yığının adresine atlamak mümkündür çünkü asla değişmeyecektir

  • ASLR ile, ona atlamak için ret2esp/ret2reg gibi teknikler gerekecektir

  • nx ile, bir ROP kullanarak memprotect'i çağırmak ve bazı sayfaları rwx yapmak için gerekecektir, ardından oraya shellcode'u depolamak (örneğin okuma çağırarak) ve ardından oraya atlamak.

  • 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.

  • ASLR veya PIE etkinse, ROP gadget'larını kullanabilmek için bunları geçmek gerekecek.

  • SROP ret2execve'yi hazırlamak için faydalı olabilir

  • Çeşitli register'ları kontrol etmek için ret2csu ve ret2vdso gadget'ları

Libc Aracılığıyla

  • 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 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.

  • ASLR ancak PIE** etkin değilse**, libc'yi bildiğiniz ve binary'nin system fonksiyonunu kullandığı durumda, '/bin/sh' adresiyle birlikte GOT'taki system adresine ret yapmak mümkün olacaktır (bunu çözmeniz gerekecektir).

  • ASLR ancak PIE** etkin değilse**, libc'yi bildiğiniz ve binary'nin system'i kullanmadığı durumda:

  • ret2dlresolve'yi kullanarak system'in adresini çözümlemek ve çağırmak için

  • ASLR geçmek ve bellekteki system ve '/bin/sh' adreslerini hesaplamak.

  • ASLR ve PIE etkin ve libc bilinmiyorsa: Şunları yapmanız gerekecek:

  • 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.

  • ASLR veya PIE adresleri etkileyebilir.

  • İlklenmemiş değişkenler: Asla bilemezsiniz

Last updated