Stack-based Buffer Overflow nedir ? Nasıl çalışır?

Faik Sevim
6 min readJul 3, 2021

BOF nasıl oluşur?

Basitçe bir saldırgan uygulamanın belleğini doldurarak taşırdığında oluşur. Bu, programın yürütme yolunu değiştirerek istediği kodu işaret ederek, programın yetkisi olmadan sistemi kullanmasına izin verir.

BUFFER OVERFLOW TÜRLERİ

Stack Based Buffer Over Flow da hafızayı doldurmak daha kolaydır.Yalnızca bir uygulamanın kapladığı stack alanının doldurularak zafiyetten yararlanılır.

Heap Based Buffer Over Flow ise gerçekleştirmesi daha zor olan bir bof saldırısıdır. Bunun sebebi doldurulması gereken hafıza alanının stacktaki gibi sınırlı olmamasıdır.

NEDEN BOF OLUŞUR? NEDEN HALA BOF SORUNU VAR ?

Hala BOF zafiyetlerinin olmasının temel sebebi geliştirilen yazılım dilleridir. BOF a en yatkın olan diller C ve C++ dır. Bunun sebebi ise bu dillerin hafızalarındaki verilerin üzerine yazmaya veya verilere erişmeye karşı korumalı olmamalarıdır. Mac OSX, Windows ve Linux, C ve C ++ yazılmıştır.

Java, JavaScript ve C# gibi diller BOF saldırılarını minimize edecek şekilde geliştirilmişlerdir.

STACK NEDİR?

•Kullanımı kolaydır.

•Oluşturulan değişkinler stack kapsamından çıkınca otomatik olarak yok edilir.

•Ulaşılması heap‘e göre oldukça hızlıdır.

•Stack üzerinde kullanım fazla olduğunda alan yeterli olmayabilir. Mesela 20 boyutlu bir diziye 21 eleman atamak gibi…

•Oluşturulan değişkenler pointer olmadan kullanılabilir.

•Derleme zamanında oluşturulur.

  • Kullanacağınız yerin boyutunu tam olarak biliyorsanız Stack‘i kullanmak sizin için uygun olacaktır.

Bir YIĞITIN (STACK) ANATOMİSİ

ESP: Stack pointer. Stack veri yapısının LIFO (Last In Firs Out) son giren yani ilk çıkacak elemanı gösterir.Bir nevi üst sınır.

EBP: Stacktaki ilk giren elemanı işaret eder. Bir nevi altsınır.
EIP: Instruction pointer olarak geçmektedir.CPU’nun an itibariyle code segment’i içerisindeki hangi instruction’i çalıştıracağını gösterir.

AMACIMIZ EIP yi değiştirerek bizim istediğimiz bir exploiti çalıştırmasını sağlamak.

Ama nasıl?

Spiking = Bu aşamada programı stack ı doldurarak programı crash ettiriyoruz.

Fuzzing = Bu aşamada da programı tam olarak nerede bozduğumuzu buluyoruz. Random değil. Programı kırmak için kaç byte yollamamız gerekti ?

Ofset bulma = Tam olarak hangi byte ta program crach etti bunu bulduğumuz aşama .

EIP üzerine yazarak sömürme.

Bad karakteri bulma = yazacağımız Shellcode da kullanılmaması gereken karakterler.

Doğru modülü bulma = EIP nin ESP yi işaret edeceği modülü bulma

Shellcode oluşturma.

Uygulamada kullanılan programlar.

•PCMan FTP Server 2.0.7 (Win xp de çalışıyor)

•Immunity Debugger

•Kali Linux Kullanılmıştır.

Immunıty debugger

PCMan i İmmunity debugger ile açarak yaptığımız işlemlerin program üzerindeki etkisini inceliyoruz.

kod parçası uygulamanın USER parametresine 5000 adet A karakteri göndermektedir.

İşlem gerçekleştiğinde PACMan çöküyor. Buradan yola çıkarak olası bir zaafiyet arayışına giriyoruz.

EIP ye yazmayı başardık.

Ama kaçıncı karakterde yazdık?

Bu sorunun cevabını bulmak için pattern create ile oluşturduğumuz deseni parametre olarak gönderiyoruz ki desenin hangi bölümünün eip de olduğunu bularak kaçıncı karakterde eip ye ulaştığımızı bulalım.

EIP ye yazılan değer şimdi ne oldu ?

Değerimizin 6F43376F olduğunu gördük.

Pattern_ofset ile kaçıncı karakter olduğunu buluyoruz.

EIP Kontrolü ve İstediğimiz Değeri Yazma

EIP ye İSTENİLEN DEĞERİN YAZILDIĞI GÖRÜLDÜ

Bir sonraki adım oluşturulacak olan sheel codun (asıl yollamak istediğimiz reverse sheel yapmamızı sağlayacak kod ) boyutununun maksimum değerlerini belirlemek.

Bunun için yukarıdaki ekran alıntısında görüldüğü üzere EIP yi “A” karakteriyle doldurduktan sonra ESP alanınını “C” karakteriyle dolduruyoruz.

“C” DEĞERİNİN yazıldığı başlangıç ve bitiş adreslerini bulup çıkarma işlemi yaptığımızda ESP alanına yazabilecek en fazla byte değerini bulunabilmektedir.

ESP alanına yazılabilecek en fazla değer 4104 byte’dır. Exploit kodunu geliştirirken yazıIan shellcode bu değerin üstüne çıkmamalıdır.

JMP ESP (FFE4)

Programın içinde JMP ESP yani EIP adresine yazılan değer ESP ye geçmesine yaracak adresi bulmamız gerekmektedir. ( EIP ye öyle bir değer atamalıyız ki o değer ESP yi işaret etmeli)

ESP alanında bizim hazırlayacağımız shellcode çalışacaktır. ( Boyutu maks 4104 byte )

JMP ESP (FFE4) nasıl bulunur ?

Önce doğru modül bulunur. Doğru modül memory write protection içermemeyan bir modül olmalı ki yazabilelim. Aşağıdaki görselde SafeSEH Rebase ASLR gibi korumaların kullanılmadığı modülü arıyoruz.

Doğru modül seçildikten sonra jmp esp aratıldığında 7E429353 ADRESİ BULUNUR

Alternatif olarak !mona find -s “\xff\xe4” -m ‘MODUL ADI’ da kullanılabilir.

EIP değerine bu adresi yazarak programın ESP alanına geçmesi SAĞLANIR.

Shellcode içerisinde bulunmasını istemediğimiz yani program tarafından engellenen karakterlerin tespiti yapılıp shellcode hazırlanırken bu karakterlerin kullanılmaması gerekmektedir.

BAD CHARACTERS

X00

x0A

x0D

Sonunda sevgili FF yani son hex karakter karşımızda. ( FF i gördüğüme hiç bu kadar sevinmemiştim :) )

Kısaca kullanılmaması gereken karakterlerimiz x00, x0a ve x0d

Sevgili Shell code

Exploitin son hali

Kodumuzda JMP ESP’nin hemen altında bulunan buff+=”\x90″*40 kodu NOPs olarak geçmektedir. Nop, No Operation’ın kısaltmasıdır. Bekleme rutinleri yazmamızı kolaylaştırabilen assembly komutudur.
x86 işlemci mimarisinde çalıştığımız için x90 kullanıldı. Bu komutun özelliği hiçbir iş yapmaması ve çoğu zaman sadece tek byte yer kaplamasıdır. CPU, komutun üzerinden geçecektir. Shellcode işleme alınmadan önce, başlangıcını NOP’lerle doldurarak shellcode güvenilirliği artırılabilir. Güvenilirliği artırmak için son kodumuzun başına 40 NOP eklendi. Tabiki payload boyutunun esp boyutundan (4104 byte) çok daha küçük olduğu bunu yapabildik .

Sonuç

Reverse shell başarılı bir şekilde gerçekleşti. Bu uygulama öğretici olması açısından eski ve sömürülmesi kolay olan işletim sistemi ve uygulama ile yapılmıştır. Burada kullandığım ekran alıntılarının çoğu kaynaklarda belirttiğim bilgi yazılarından alınmıştır.

(Burada kullandığım ekran alıntılarının çoğu kaynaklarda belirttiğim bilgi yazılarından alınmıştır. Bu yazıyı düzenlememin amacı daha anlaşılabilir ve net bir bilgi sağlamaktır.)

Kaynaklar

https://www.geeksforgeeks.org/buffer-overflow-attack-with-example/#:~:text=When%20more%20data%20(than%20was,whatever%20data%20they%20were%20holding.

https://www.imperva.com/learn/application-security/buffer-overflow/

https://en.wikipedia.org/wiki/Heap_overflow

https://www.bilgigunlugum.net/prog/cprog/c_dinamik

https://medium.com/yigit-xcodeproj/stack-ve-heap-arasindaki-fark-nedir-stack-vs-heap-c61e3d463dd7

https://gurelahmet.com/stack-tabanl%C4%B1-buffer-overflow-zafiyeti-pcman-ftp-server-2-0-7/

https://www.thecybermentor.com/buffer-overflows-made-easy

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

No responses yet

Write a response