sağol kardeşim...

Buffer Overflow Dökümanı ÖN NOT: Bu dökümanı anlayabilmeniz için çok azda olsa C ve Assembly bilmeniz gerekir. Bu döküman profesyoneller için değildir, sadece buffer overflow'a giriş olarak basit bir dille yazılmıştır. Yazar: Console. İçerik: C'de buffer overflow Seviye: Başlangıçla orta arası Değinelecek programlama dili: C Merhabalar, Bellek taşmaları her zaman programlama tarihinde bir sorun olmuştur. Her dilde bu sorun vardır, fakat donanıma daha yakın diller olduğu zaman daha çok dinamik bellek yönetimi yapıldığı için daha çok bellek taşmaları meydana gelmiştir. Bellek taşması nedir? Bellek taşması bellek içerisinde belirli segment: offset aralığı içinde çalışırken aniden offsetlerden çıkıp başka offsetlere kayması veya aşağı bellekten (0x00)'dan yukarı bellek olan 0xFF'ye taşması ile oluşur.(Bunlara bug dediğimiz böcekler neden olur) Tam tersi durumlarda mevcuttur. Örneğin: (unsigned char maximum + 1 ile bellek taşması meydana gelir) Mantığı: Dolmuşa bindiniz. Hayvanoğlu hayvanın şöförü dolmuşu ağzına kadar doldurdu. Ondan sonra bi tane müşteri daha binmeye çalışırsa yeter be dersiniz, dolmuş taştı taşacak dersiniz. Neyse devam edelim: Tersi dediğim olay ise ileriye doğru taşma değilde geriye doğru taşma olabilir. . . . 0xFFFE 0xFFFF 0x0000 0x0001 . . . Şimdi; Yukarıdaki tablomsu şeye bakarak ne görürsünüz; yani hangisi son adrese ulaşmanın kısa yolu; tabi ki 0x0000'den bir geriye gelmek Devam edelim; Peki bu programlar için ayrı ayrı bellek taşmaları var (bkz. milw0rm.com). Bunlar nedir? Bunlar, programdaki bugları kullanarak başka bir çalışan programın çalıştığı offset adresini deşmek, yıkmaktır. Yani şöyle izah edersek: 0x003A'da programın çalıştığı adresin sonu 0x0031 . . 0x003A 0x003B NOT : Buraya ancak programdaki bir hata sonucu müdahele edilebilir! şimdi kısa bir ara vererek biraz ana konuya dönelim: Kısaca bir buffer overflow programı nasıl yazılır. Şimdi sizlere açık kaynak kodlu küçük bir kod örneği göstereceğim, sırf bu döküman için açık kaynaklı olsun istedim Kod: / bufferoverflow. c Copyright 2009 console <console@console-desktop> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. / #include <stdio. h> #include <stdlib. h> int main Bu kodu dev c++ ile derleyiniz çünkü ona göre yazılmıştır. 1a) Linux için derleme Linux kullanan kullanıcılarımız, GCC 4.4 veya GEANY ile derleyebilirler DİPNOT: GEANY'de derledikten sonra kodu çalıştırırken tüm izinleri vermeyi unutmayın. NOT: Tavsiyem GCC'dir. Terminalde derleme işlemi: NOT: Dosyanın olduğu dizinde olduğunuzdan emin olun ve Kod: $ chmod +x bufferoverflow. c $ gcc bufferoverflow. c bufferoverflow. c: In function 'main': bufferoverflow. c:32: warning: too few arguments for format bufferoverflow. c:34: warning: return makes integer from pointer without a cast bufferoverflow. c:34: warning: function returns address of local variable /tmp/ccmLOHlf. o: In function `main': untitled. c:(. text+0x24): warning: the `gets' function is dangerous and should not be used. $ ./a. out Kullanım: 2 harften fazla bir sözcük veya cümle yazınız asdasdasd overflowing..., �p����I��"�0�ݷ�ۇٴ0Kܷ��ݷ Segmentation fault $ diye sonuç alacaksınız. Altı çizili olan satıra dikkat edecek olursanız; taşma olacağından; tehlikeli diye uyarı veriyor ÖNEMLİ NOT: Dilerseniz system ; satırı ile #include <stdlib. h>'ı kaldırabilirsiniz. Windows'ta düzgün çalışsın diye koydum 1b) Windows için derleme Dev c++'ı açın bir c kaynak kod dosyası oluşturun derleyin ve çalıştırın Kodun mantığı Standart giriş çıkış kütüphanemizi belirttikten sonra int main içinde argümanları belirtiyoruz isterseniz direk koda int main diye giriş yapabilirsiniz. Sonra kullanımını ekrana yazdırıyoruz ardından gets ile bellekten dizgiyi alacağız fakat ondan önce char exp ; diye belirtiyoruz burası programa ayırdığımız yer. Fakat programa fazladan karakter yazarsak taşma olacaktır. print ile de taşma olduğu için bazı karakterler tanımsız veya ascii olrak çıkacaktır sonrada zaten windows'ta bi tuşa basta bitsin bu dert diyecek linux'da kendi direk terminale çıkacak. İlk buffer overflow'umuzu yaptık artık algoritmayı öğrendiğinize göre yenilerini siz yapın; Özet: 1)UCHAR_MAX + 1 ile taşma yapılabilir 2)Program hataları ile sonraki veya başka adreslere taşma yapılabilir. 3)Bellek adreslerinde segment üzerinden offset içine yerleşme yapılır 4)Her bir harf bile bellekte tek bir yere sahiptir! 5)Buffer overflow başka yöntemler ile de yapılabilir. Saygılarımla console. Not: Eğer beğeni olursa; sabitlerseniz sevinirim - Root@