Uzunca bir yazı olacak, bu yüzden Stack ve Buffer gibi kavramları anlatmakla fazla vakit kaybetmeye gerek yok (ilerleyen kısımlarda bir görselle bir kaç şey anlatmam dışında). Bu adresten ayrıntılı bilgileri okuyabilirsiniz. Şimdi bir uygulamayı patlatmak ve overflow ettiğimiz uygulama için Exploit yazmak için yapılan temel adımları şöyle sıralayabiliriz.
ÖNEMLİ: Bu yazıda anlatacaklarım herhangi bir koruma mekanızmasına (SEH, ASLR vs.) karşı bypass içermemektedir. O tarz overflow ve exploit kodlamaları ileriki yazılarda olur umarım -üşenmez yazarsam-
- Uygulamanın girdi alan noktalarında bir overflow tespit etmek
- Overflow olan sınırı tespit etmek
- Uygulama içinde bizi Stack'e yönlendirecek adresi bulmak
- Bad charları tespit etmek
- Uygun shellcode yazmak
- Ve bomm
Temel olarak buffer overflow için şunu söyleyebiliriz: Uygulamanın çalışma sırasında kullanıcıdan aldığı bir girdiye ayrılan sınırın üstünde data girişi yapmaktır. Birçok overflow yazısında int buff[125] gibi bir girdi alanı açılıp strcpy, memcpy vs ile C dilinin kontrolsüz fonksiyonlarını kullanarak uygulamaya 125'ten fazla bir input yollayarak programı patlatmayı anlatır. Anlatılanda doğrudur, mantık aynen bu şekilde işler, haddinden fazla inputu göndermek ve eğer kontrol yoksa uygulamayı patlatmak.
Uygulamaya fazla input yolladığımızda stack'in yapısından dolayı stack'e atılan parametreler ve geri dönüş değerler ezilir/kaybolur bundan dolayı uygulama crash olur ve sonlanır. İyi bir exploit, geri dönüş değerini istediğimiz bir alana referans ettirmek ve o alana shellcode'umuzu doldurmak ile olur. Sonrası işlemcide, sağolsun kendisi bizim için işlemleri yapacaktır.
Patlatacağımız uygulamaya ait Perl diliyle yazılmış exploit koduna Exploit-db den bakabilirsiniz. Biz Python ile exploiti geliştireceğiz. Verdiğim linkte uygulama için download linkide bulunmakta.
Let's Begin
Öncelikle uygulamanın kabul ettiği formatlardan biri olan m3u için dosya oluşturup içini junk datayla dolduran bir kod yazalım. Başlangıç olarak 10.000 byte verelim.