Stack Buffer Overflow Tips (OSCP)

Bu yazımızda buffer overflow exploit’leri geliştirirken karşılaşılabilecek durumlardan, kullanılabilecek tekniklerden ve anahtar kelimelerden teorik olarak bahsedilecektir. Yazımızın devamında tekniklerin daha iyi anlaşılabilmesi için alt seviye programlama, basit buffer overflow exploit’i geliştirme gibi konulara aşinalığın olması önerilmektedir. Klasik buffer overflow zafiyetini tekrar etmek konunun devamı için iyi olacaktır. Hafızanın tamamında ve EIP offset’inin ardında gerekli alan varsa herhangi bir ekstra işlem gerekmeden offset’e kadar olan kısım doldurulur ve ardından EIP üzerine “JMP ESP” komutunun olduğu memory adresi yazılır. Memory adresinden sonra ise mümkünse nop’lar ardından shellcode ve yer kalmışsa ekstra karakterler ile crash alınan boyuta kadar payload doldurulur. Exploit çalıştırıldığında “JMP ESP” komutu çalışır ve ESP’ye atlanır. Burada nop’lar üzerinden shellcode çalıştırılır ve istenilen komut çalıştırılmış olur.

Eğer ki EIP offset’inden sonra yeterli yer yoksa, örneğin hafızanın tamamında 2500 byte’lık yer bulunmakta ve EIP offset’i 2450 ise offset ardında kalan 50 byte’lık kısıma shellcode sığmayacaktır. Bu durumda diğer register’lardan yardım alınabilmektedir. Yardım alınacak register tespiti için program çalıştırıldığında, tarafımızca gönderilen payload’ın (tespit aşamasında 2450 adet A) başka bir register’da görülmesi gerekmektedir. Örneğin gönderilen payload ECX register’ında gözüküyor ise ECX register’ından yardım alınabilir anlamına gelmektedir. Register’ı belirledikten sonra yapmamız gereken işlem “JMP ECX” komutunun opcode karşılığını bulmak ve memory adresinden sonra nop’lar ile birlikte “JMP ECX” komutunu eklemektir. Bu opcode msf-nasm_shell yardımı ile bulunabilmektedir. Sonrasında ise kötü karakter tespitinin yapıldığı varsayılarak shellcode oluşturulacaktır. Oluşturulan shellcode payload’ın en başına yani EIP offset’e kadar doldurma işlemi yapılan bölgeye eklenecektir. Göndereceğimiz shellcode’u koruma amaçlı başına ve sonuna nop’lar koyulabilmektedir. Bu sayede önce nop’lar çalışıp, ardından istenilen şekilde shellcode çalışacaktır. Çalışma mantığını kısaca özetlemek gerekirse EIP’ye gelen “JMP ESP” kodu çalışacak ESP’nin gösterdiği alanda nop’lar ve sonrasında “JMP ECX” kodu olduğundan bu kodlar çalışacak ve ECX’e atlanacaktır. ECX’te ise nop+shellcode+nop şeklinde yollanılan kısım bulunacaktır ve nop’lar çalışmaya başlayıp ardından shellcode istenilen şekilde çalışacaktır.

Hafızada çok az yer bulunan durumlarda ise örneğin hafızada 300 byte yer bulunmakta ve EIP offset’i 150 ise oluşturulacak shellcode hafızanın tamamına dahi sığmayacaktır. Bu durumda “Egg Hunting” metodu kullanılmaktadır. Metodu kısaca açıklamak gerekirse; shellcode başında özel bir dizi ile başka bir bölgeye yerleştirilmeye çalışılır, bu özel diziyi arayıp ardından gelen kodun çalıştırılmasını sağlayacak bir kod parçası yazılır veya msf-egghunter gibi araçlarla oluşturulur. Bu koda kısaca “Egg Hunter” kod denebilmektedir. Klasik overflow exploit’i yazılırken yapılan adımlar burada da aynıdır; offset’e kadar doldurulmaktadır, “JMP ESP” komutu içeren adres EIP üzerine yazılmakta ardından egg hunter kod ve kalan kısmı dolduracak karakterler yollanmaktadır. Exploit çalıştırıldığında ise “JMP ESP” kodu çalışmakta ardından ESP’de bulunan “Egg Hunter” çalışıp diğer bölgedeki shellcode’u bulmaktadır ve çalışmasını sağlamaktadır. Böylece istenilen kod çalıştırılmaktadır.

DEP gibi korumaların olduğu durumlarda (kullanılabilecek başka durumlarda var) ise ROP (Return Oriented Programming) tekniği kullanılabilmektedir. Bu teknikte programın içinde okunabilir ve çalıştırılabilir kısımlarda bulunan hazır kodlar aracılığı ile bir kod zinciri oluşturulmaktadır. Bu kod zincirinin amacı dolaylı yoldan ESP’ye atlamak ve ardından istediğimiz komutları çalıştırmaktır. Klasik overflow exploit geliştirme adımlarında olduğu gibi offset’ten öncesi doldurulmakta, farklı olarak “JMP ESP” memory adresi yerine rop chain gelmektedir. Sonrasında ise klasik olarak nop+shellcode+nop dizisi eklenerek exploit tamamlanmaktadır. Exploit çalıştırıldığında ye rop chain’deki ilk adres yerleşecek ve kod zinciri çalışmaya başlayacaktır. Amacına ulaşan kod zinciri ESP’ye atlayacak ve ardından gelen nop+shellcode+nop çalıştırılacaktır. Bu sayede istenilen kod çalıştırılmış olacaktır.

Zaman ayırıp okuduğunuz için teşekkürler 🙂

Berk KIRAS | PwC-Cyber Security Specialist

  • Referanslar
  • [1]-Metasploit Framework – https://www.metasploit.com/
  • [2]-M. Alparslan Akyıldız – Exploit Geliştirme 101
  • [3]- Secpod – https://www.secpod.com/blog/hunting-the-egg-egg-hunter/
  • [4]-Ajin Abraham-Slide – https://www.slideshare.net/ajin25/exploit-research-and-development-megaprimerwin32-egghunter
  • [5]-corelan.be – https://www.corelan.be/index.php/2010/06/16/exploit-writing-tutorial-part-10-chaining-depwith-rop-the-rubikstm-cube/