- 8 Eyl 2016
- 1,646
- 998
4 parametre alan fonksiyonum var. Flag, buffer isminde local değişkenlerim var bunların değerlerini de girdim. Main de fonksiyonumuzu aldığı parametrelere göre değerlerini vererek çağırdım.
Programı derleyip GDB de çalıştırdım. Şimdi test_function çağrılmadan önceki instructiona ve test_function içindeki ilk instructiona break point koyacağım.
Şimdi programı çalıştırıp rip, rbp, rsp instructionlarımın durumuna bakacağım.
İnstructionlarımın tuttuğu adresleri görüyorum. Rsp ve rbp stack segmentte, rip ise text segmentte yer alır. Rsp ve rbp de yazma izni varken rip de sadece okuma işlemi yapabiliriz.
Ripden 5 tane daha adres getirdiğimde rip’nin ilk hangi adrese point ettiğini ve o adreslerin hangi adreslere point yaptığını görüyorum. RIP instruction’ın çalışma mantığı da, program çalıştığı anda rip text segmentte ilk adrese set edilir program çalışmaya başlar. İşlemci de sırayla RIP’nin point ettiği instruction okunuyor, bu instruction’ın byte değeri rip’ye eklenerek bir sonraki instruction bulunuyor. Bu işlem sürerken de rip’nin ilk gösterdiği instruction da çalışmış oluyor. Son olarak Burada call komutu ile de test_function içindeki ilk instruction çağrılıyor, yani test_function’a gidiliyor.
Buraya kadar test_function çağrılmadan önceki durumu inceledim şimdi cont edip test_function içine girelim. Daha sonra registerlarımızın durumlarına tekrar bakalım.
İlk breakpoint koyduğum yeri incelediğimizde yani main içindeyken rbp rsp adreslerimizin şuan yeni fonksiyona geçince adreslerin değiştiğini de görüyorum.
RIP’den 5 adet veri getirdim. Görüdlüğü gibi RIP registerım test_function içinde. Şimdi de rsp’den 4 bytelık değerler getireceğim.
Rsp den 16 tane 4 byte değer getirdim. Şimdi bir de main’i disassemble edeceğim burada dikkat çekmek istediğim bir nokta var.
Stackte gördüğüm beyaz ile üstünü çizdiğim alan benim fonksiyonum çalıştıktan yani call edildikten sonra gidilen adres yani return adrestir. Call’dan sonra mov komutuna geçiliyor işte bu mov komutundaki adres rip’nin dönüş yani return adresidir. Burada return adresine dikkat çekmek istedim ki bu adresi daha sonra buffer overflow exploit yönteminde değiştirip fonksiyonun devam etmesi gereken yere gitmesini engelleyip kendi yazdığım instruction’a yönlendirebilirim. Okuduğunuz için teşekkürler.