Revealed content
Merhaba değerli okurlar bu gün size pwn( yani binary exploitationda) yaygın olan ret2win hakkında yazacağım.Ret2win pwn challenge'ları genellikle sınırlı kaynak kontrollü bir programın zafiyetini sömürmeye dayanan CTF (Capture the Flag) yarışmalarında karşımıza çıkan türden zorluklardır. Bu tür sorunlar, genellikle hedeflenen programın kaynak kodu ve çalışma zamanındaki davranışı hakkında bilgi sahibi olmamızı gerektirir.
Static kod analizlerinden sonra belirlediğimiz zafiyyet ile bu tür challenglari solve ede biliriz)
Static kod analizlerinden sonra belirlediğimiz zafiyyet ile bu tür challenglari solve ede biliriz)
Revealed content
- Bellek taşması noktasını belirliyoruz: Kaynak kod analizi sırasında, hedef programda bir bellek taşmasının gerçekleşebileceği noktaları tespit ediyoruz. Bu noktalarda, kullanıcı inputlarının hedef programın bellek alanının sınırlarını aşabileceği bir zafiyet olabilir.
- İstenilen işlevi çağırmak için payload oluşturma: Bellek taşması noktasını belirledikten sonra, hedef programın kontrolünü ele geçirebilmek için bir payload (zararlı veri) oluşturmanız gerekecektir. Bu payload, hedeflenen işlevin adresini ve gerekli parametreleri içerecektir

Gördüğünüz gibi login fonksiyonunda buffer length olarak 18 verilmiş ve bizden scanf ile input alınıyor
main içerisinde bu login çağırılıyor ve piratica() functionu çağırılmamış kodda peki biz buraya nasıl geçit yapıcaz?- Tabii ki bufferi taşırcaz
===============================================================================================================================================================================
İlk önce checksec kullanarak binaryimizi inceleyelim :

(protection bulunmuyor)
Şimdi EIP instructionun offsetini bulalım peki burada offset ne anlama geliyor? - yani eip instructionumuzun return adresine üzerine yazmadan önce ne kadar char yazmamız gerek
EIP programın çalışma zamanında bir sonraki talimatın adresini tutar. İşlemci, EIP kaydındaki değeri kullanarak bellekteki talimatların sırasını takip eder. Her bir talimatın bellek adresi, EIP'nin gösterdiği adresle belirlenir. İşlemci, EIP'nin gösterdiği talimatı yürütür ve ardından EIP'yi bir sonraki talimatın adresine günceller.
Örneğin, bir C programını çalıştırdığınızda EIP kaydı programın ilk talimatının bellek adresini gösterecektir. İşlemcinin çalışma sırasında EIP'yi güncellemesi ile programdaki talimatlar sırayla çalıştırılır.
buffer overflow gibi güvenlik açıklarının sömürülmesi durumunda hedef programın EIP-sini kontrol altına alinarak istenilen talimatın adresini yerleştire biliriz . Böylece istediğimiz kodu çalıştırırız.
===============================================================================================================================================================================
pwndbg kullanarak cyclic ile pattern oluşturalım:
Kod:
cyclic 100
Sonra run yapıp binaryimizi başlatalım input olarak paterni giriyoruz sonrasında program crash oluyor ve şimdi EİP-de hangi charların tutulduğuna baka biliriz:

cyclic -l "aaia" yazarak offsetin 28 olduğunu bulduk şimdi exploitimiz bu şekilde olucak(pwntools kullanilmistir) :

not: burada p32() fonksiyonu little endian ile binaryni pack edip yollar
Benden bu kadar hoşçakalın

Bu içeriği görmek için giriş yapın.
Moderatör tarafında düzenlendi: