Temel BOF

Hackmetu yazımızda bundan sonra biraz da reverse eng. konularına yöneleceğimizi söylemiştik. Geçenlerde bir ctf nin sorularını çözerken bi bof sorusuyla karşılaştık. Soru temel buffer overflow mantığına dayalı. Çözmüşken anlatalım dedik;

Öncelikle çalıştırılabilir dosya uzak sunucunun belli portuna gelen istekleri dinlemekteydi. Soruda dosya da paylaşılmıştı.

Dosyayı aldık, inceledik. i386 Elf dosyasıydı(linux executable).

Dosyayı çalıştırdık, ne tepkiler verdiğine baktık;




İsim sordu, uzun bir string girdik çıktı şöyle oldu;




Gördüğünüz gibi "segmentation fault" aldık. Bof açığı mevcut. Biraz daha detaylı incelemek için Ida ile statik debug yaptık.



Şöyle bi bakıldığında, program maine girmekte, input almakta, tanımlı string basmaktadır. Main fonskiyonun herhangi bir yerinde flag mevcut değildi. Idada custom fonksiyonlar da görünmekte. Tanımlanmış show_soln fonksiyonu aşağıda görülmektedir.


Gördüğünüz gibi fonk. çağrıldığında flag.txt yi okuyup cevabı basmaktadır. Alttaki ok ise fonksiyonun kod segment offset adresidir. Yapacağımız şey belli olmuştu. Girdiğimiz stringde taşmaya sebep olarak eip register'ına bu fonksiyonun adresini yazmak.

Bunun için önce localde denemeler yaptık. Bu yüzden kendimiz bi flag.txt oluşturduk.



Bof denemelerini gdb ile debug ettik

gdb main
run

Dedikten sonra 50-60 karakterlik string denemesi yaptık.

Taşmadan sonraki register değerlerinden(gdb ye info all-registers yazılır) yola çıkarak girdinin kaçıncı karakterden itibaren eip üzerine yazıldığını bulduk;


44. byte tan sonrası eip ye yazılmıştı.
Yani göndereceğimiz stringde 44. karakterden sonra show_soln fonksiyonunun adres bilgisi olmalıydı. Tabi adres bilgisi hex byte olarak 4 byte olduğu için okunabilir karakterler olmak zorunda değil. Bunun için notepad++ hex editör plugini iş görür.(veya echo -e '\x323232...' ile doğrudan karakterlerin hex karşılığını da gönderebilirsiniz )




show_soln fonksiyonunun adresini(0x08048732) 44. karakterden sonra ekledik. Ancak eklerken adresi tersten byte byte yazmak gerekmekte. Çünkü intel işlemciler little-endian sistemini kullanmakta(ram'e yazarken sağdan sola doğru)



Localde denememizi yaptık. Gördüğünüz gibi echo'yu pipe ederek inputu otomatik gönderdik.


Şimdi de cat ile hazırladığımız payload.txt dosyasını pipe ettik;


Gördüğünüz gibi flag başarılı bir şekilde ekrana basıldı.
Şimdi aynı işlemi remote server için yapalım.

Bu kez netcat'e pipe edeceğimiz için echo + cat kullandık.


Bu kadar.