INTEGER OVERFLOW ***************************************************************/



Benzer belgeler
Bit, Byte ve Integer. BIL-304: Bilgisayar Mimarisi. Dersi veren öğretim üyesi: Yrd. Doç. Dr. Fatih Gökçe

Dr. Fatih AY Tel: fatihay@fatihay.net

Eln 1001 Bilgisayar Programlama I

Sınav tarihi : Süre : 60 dak. a) strstr b) strchr c) strcat d) strcpy e) strlen. a) b) d) e) 0

C Programlama Dilinde Değişkenler

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

PROGRAMLAMAYA GİRİŞ DERS 2

Giris {\} /\ Suhap SAHIN Onur GÖK

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-8 Değişken Tipleri ve Temel Giriş/Çıkış İşlemleri

Adım Adım C-II. Eksik kalmış konular

ESM-361 Mikroişlemciler. 3. Hafta Ders Öğretim Üyesi Dr.Öğr.Üyesi Ayşe DEMİRHAN

MAK 1005 Bilgisayar Programlamaya Giriş C DİLİNE GİRİŞ. Prof. Dr. Necmettin Kaya

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

Programlama Dilleri. C Dili. Programlama Dilleri-ders08/ 1

C Programlama printf() Fonksiyonu

Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : dak.

Bölüm 2 - C ile Programlamaya Giriş

Sınav tarihi : Süre : 60 dak.

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

Bit, Byte ve Integer. BIL-304: Bilgisayar Mimarisi. Dersi veren öğretim üyesi: Yrd. Doç. Dr. Fatih Gökçe

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

Basit Bootstrap Uygulaması

C Programlama Dilininin Basit Yapıları

Programlama Dilleri 1. Ders 5: Göstericiler

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu DİZİLER

BĠLGĠSAYAR PROGRAMLAMA II C++ Programlamaya GiriĢ Published by Juan Soulié

2. SAYI SİSTEMLERİ 2. SAYI SİSTEMLERİ

Deney 7: Fonksiyon Tanımlama ve Parametre Aktarım Yöntemleri

Sayı sistemleri-hesaplamalar. Sakarya Üniversitesi

MSN PROTOKOLÜNÜ ANALİZ ETMEK

BASİT C PROGRAMLARI Öğr.Gör.Dr. Mahmut YALÇIN

MAK 1005 Bilgisayar Programlamaya Giriş. Fonksiyonlar. Prof. Dr. Necmettin Kaya

Big Endian & Little Endian K.Atilla Toker İzmir Üniversitesi Meslek Yüksek Okulu Bilgisayar Programcılığı Ver:01

Algoritma ve Programlama: Karar Yapıları ve Döngüler

Qt ile Bir Ağ Uygulaması

8. İŞARETCİLER (POINTERS)

2. SAYI SİSTEMLERİ. M.İLKUÇAR - imuammer@yahoo.com

Fonksiyonlar (Altprogram)

Değişkenler tanımlanırken onlara ne tür veriler atanabileceği de belirtilir. Temel veri türleri oldukça azdır:

Genel Programlama II

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

Hafta 12 Karakter Tutan Diziler

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

Bit, Byte ve Integer. BIL-304: Bilgisayar Mimarisi. Dersi veren öğretim üyesi: Dr. Öğr. Üyesi Fatih Gökçe

int printf (const char *format [, argument,...]);

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

Struct VE GÖSTERİCİLER FONKSİYONLARDA STRUCT KULLANIMI Programlama dilleri hafta -

Sayı Sistemleri. Onluk, İkilik, Sekizlik ve Onaltılık sistemler Dönüşümler Tümleyen aritmetiği

Temel Giriş/Çıkış Fonksiyonları

C++ Dersi: Nesne Tabanlı Programlama

Hafta 8 C Dilinde Değişken Tipleri ve Temel Giriş/Çıkış İşlemleri

Algoritma Geliştirme ve Veri Yapıları 3 Veri Yapıları. Mustafa Kemal Üniversitesi

IF / ELSE IF / ELSE. Bu deyimler, koşullu işlem yapan deyimlerdir ve daima if deyimi ile başlar, else if veya else ile devam eder.

Bit, Byte ve Integer. BIL-304: Bilgisayar Mimarisi. Dersi veren öğretim üyesi: Yrd. Doç. Dr. Fatih Gökçe

Programlama Dilleri. C Dili. Programlama Dilleri-ders02/ 1

C PROGRAMLAMA D İ L İ

Diziler. Dizi Tanımı Dizi Elemanlarına Değer Atama Diziler ve Göstergeler 2-Boyutlu Diziler

B02.6 Karar Verme, Eşitlik ve Bağıntı Operatörleri

Bigisayar Programlama

Bilgisayar Teknolojileri Bölümü Bilgisayar Programcılığı Programı. Öğr. Gör. Cansu AYVAZ GÜVEN

BİL1001 Bilgisayar Bilimlerine Giriş 1

int faktoriyel(int sayi) { int sonuc = 1; for(int i=sayi;i>0;i--) sonuc*=i; return sonuc; } int main() { int sayi = faktoriyel(5); }

/ C Bilgisayar Programlama Yıliçi Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

Döngü (Loop) Deyimleri / Veri Belirleyicileri / Matematiksel Fonksiyonlar

BÖLÜM 11: YAPISAL VERİ TİPLERİ

Adı Soyadı : Öğrenci No :

BİLGİSAYAR TEMELLERİ VE PROGRAMLAMAYA GİRİŞ

8. Bölüm DİZİLER. tip dizi_ismi[eleman_sayısı]; Bütün diziler 0 ile baţlar.

Sınav tarihi : Süre : 60 dak. c) En başta #include<stdio.h> yazılmamıştır. c) zt d) Pi e) X0

Programlamaya Giriş. Program : Belirli bir problemi çözmek için bir bilgisayar dili kullanılarak yazılmış deyimler dizisi.

Üst düzey dillerden biri ile yazılmış olan bir programı, makine diline çeviren programa derleyici denir. C++ da böyle bir derleyicidir.

şeklinde tanımlanmıştır. O halde, dosyaları daha önceki bilgilerimizi kullanarak FILE *Dosya1, *Dosya2;

Toplama işlemi için bir ikili operatör olan artı işareti aynı zamanda tekli operatör olarak da kullanılabilir.

Bölüm 9. Altprogramlar ISBN

NESNEYE YÖNELİK PROGRAMLAMA

BÖLÜM 4: DEĞİŞKENLER, SABİTLER VE OPERATÖRLER

Hafta 13 Fonksiyonlar

Telefon Rehberi Uygulaması

Temel Dosya İşlemleri. Kütük Organizasyonu 1

Teknikleri. Önsöz. iskender atasoy

Kocaeli Üniversitesi Bilgisayar Mühendisliği Programlama 2 Dersi Final Sınavı. A Grubu

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

Görsel Programlama 1

C ile Uygulamalar 2 - Cevaplar

ELN1001 BİLGİSAYAR PROGRAMLAMA I

Bit, Byte ve Integer. BIL-304: Bilgisayar Mimarisi. Dersi veren öğretim üyesi: Dr. Öğr. Üyesi Fatih Gökçe

BBS 514 YAPISAL PROGRAMLAMA (STRUCTURED PROGRAMMING)

Karakter katarları ile ilgili fonksiyonlar içerir Yerel kayan noktalı sayılar tanımlanır

Örnek: İki fonksiyondan oluşan bir program. Fonksiyon Tanımı

BİLGİSAYAR TEMELLERİ VE PROGRAMLAMAYA GİRİŞ

1. Bölüm Sayı Sistemleri

BLM 111 ALGORİTMA VE PROGRAMLAMA I

10. DOSYA GİRİŞ ÇIKIŞ FONKSİYONLARI

NESNEYE YÖNELİK PROGRAMLAMA C++ a Giriş

KONTROL VE OTOMASYON KULÜBÜ

Dev C++ kaynak kodlu dosya ile yeni bir boş belge oluşturmak

ELN1001 BİLGİSAYAR PROGRAMLAMA I

Diziler (Arrays) Çok Boyutlu Diziler

ÇOK BOYUTLU DİZİLER VE DİNAMİK BELLEK YÖNETİMİ İLE İLGİLİ ÖRNEKLER

Transkript:

INTEGER OVERFLOW BELGE HAKKINDA Bu belge "GNU Free Documentation Licence" ile kaynak gösterilmek ve önceden yazarından izin alınmak kaydıyla yeniden yayınlanabilir. Bu belgedeki eksik, yanlış ya da geliştirilmesi gerektiğini düşündüğünüz yerleri e-posta yoluyla bildirebilirsiniz. Belgenin ilk oluşturulma tarihi: 0 Haziran 2007 /*************************************************************** * Cihan KÖMEÇOĞLU * * cihan [at] akademi.enderunix.org * * EnderUNIX Yazılım Geliştirme Takımı * * http://www.enderunix.org * * Sürüm :.0 * * Tarih : 3.07.2007 * * Etiketler : integer, overflow * * Seviye : Başlangıç - Orta Seviye * * Makalenin en yeni versiyonu : http://www.enderunix.org/docs/intof.pdf adresinden elde edilebilir. * ***************************************************************/ Sn. Murat Balaban'a teşekkürler...

.Giriş Bu dökümanda programlama hatalarının integer overflow ile ilgili kısmından bahsedeceğim.dikkatli bir şekilde programlama yapmadığımız zaman değişkenlerimiz anlamsız değerler alabilir.bunlarda ciddi sorunlara sebep olabilir.bu dökümandaki örnekler C programlama dili ile yazılmıştır.. Integer Nedir? Integer sisteminize bağımlı olarak 32 bit ya da 64 bit sayıları saklayabilecek bir türdür. Integer'lardan bahsedildiğinde genelde daha anlaşılır olan onluk sayı sistemi kullanılmaktadır.fakat bilgisayarlar onluk sayı sistemi yerine ikilik sayı sistemini kullanmaktadır.onluk sayı sisteminde on rakam kullanılmasına karşılık ikilik sayı sisteminde sadece 2 rakam kullanılmaktadır.bunlar ise ve 0'dır. Bilgisayar sisemlerinde negatif sayıların gösterimi için bir bitinin bu gösterim için kullanılması gerekir. En yüksek değerli biti sayını negatif ya da pozitif olup olmadığını göstermektedir. Bu bit ise sayının negatif olduğunu, 0 ise pozitif olduğunu gösterir..2 Negatif sayıların gösterimi Az öncede bahsettiğimiz gibi en yüksek değerli biti sayının negatif olup olmadığını göstermektedir. Bilgisayar sistemlerinde negatif sayıları elde etmek için sayının 'e tümleyeni alınıp eklenmektedir. Örneğin: -34 sayısının gösterimi için 34 sayısının ikilik sistemde gösterimi - > 000 000 34 sayısının 'e tümleyeni - > 0 0 + -34 sayısının ikilik sistemde gösterimi-> 0 0 Görüldüğü gibi sayının en yüksek değerli biti olan 8. biti dir ve bu negatif bir sayı olduğunu göstermektedir. Peki biz ikilik düzende olan bu negatif sayının gerçekten -34 olduğunu nasıl bileceğiz. İlk olarak negatif bir sayı olup olmadığını anlamak için daha öncedende bahsettiğimiz gibi en yüksek değerli biti olan sayının en soldaki bitine bakarız. Bu bir ise negatiftir. Bu negatif sayının değerini bulmak için yine sayının e tümleyenine ekleyerek buluruz. -34 sayısının ikilik sistemde gösterimi - > 0 0-34 sayısının e tümleyeni - > 000 000 + 000 000 Görüldüğü gibi işlemin sonuncan 34 sayısını elde ettik ve bu bize 0 0 ikilik sayının -34 olduğunu gösterir.

Ya da başka bir hesaplama yöntemini de aşağıdaki gibi yapabiliriz. 0 0 ikilik sayısı için en yüksek öncelikli bitinin onluk sistemdeki değeri alınır. Bu ise sayının 8. bitidir. 2^7 = 28 İkinci adım ise sayının diğer bitlerinin onluk sistemdeki değerine toplanır. 2^6 + 2^4 + 2^3+ 2^2 + 2^ = 94 94 28 = -34 Görüldüğü gibi 0 0 ikilik sayının değeri -34 olarak bulunmuştur..3 Integer Overflow tehlikeli midir? Integer overflow oluştuktan sonra tespit edilemez. Sonucun yanlış olduğunu uygulamaya anlatmanın bir yolu yoktur. Bunun için oluşmasına izin vermemek gerekir ve kodlarımızı buna göre yazmamız gerekir.integer overflow ın doğrudan bir tehlikesi yoktur fakat başka hataların oluşmasına sebep olabilir. Örneğin buffer overflow gibi. 2. Integer Overflows Bir integer sayının tutabileceği maksimum sayıdan daha büyük sayıları saklamasını istediğimizde integer overflow oluşmaktadır. Bu durum sonucunda sayının gerçek değeri değişmektedir. Bu değişimin nasıl olacağı ise tanımlıdır. Modulo aritmetiği sonucunda çıkan değer sonuç olmaktadır. Modulo aritmetiği ise bir sayının bir sayıya bölünüp kalan değerinin alınmasıdır. Örneğin: mod 5 = 0 mod 5 = 0 Integer bir sayıya tutabileceğinden fazla bir değer atadığımızda bu MAXINT+ değerine göre modulo işlemine tutulup sonucu alınmaktadır. Aşağıdaki örnekte 32 bit olan iki say toplanmaktadır.32 bit bir sayının tutabileceği maksimum değerinden fazla bir değer başka bir 32 bit değişkenine aktarılmaktadır. Bu durumda modulo işlemine tutulup değişkene bu değer yazılmaktadır. A = 0xffffffff B = 0x C = A + B C = (0xffffffff + 0x) mod 0x00000000 C = 0 Yukarıda yapılan bu işleme ise wrap around denilmektedir. Wrap around sonucunda iki sayının toplamı 0 olmuştur.

int main(){ int a = 257; char b; Sonuç: b = b = a; printf( b = %d,b); Yukarıdaki kod ile 32 bit bir değişkenin değeri 8 bit bir değişkene atama yapılıyor. Daha öncedende bahsettiğimiz gibi bu durumda modulo aritmetiği sonucunda çıkan değer b ye aktarılmaktadır. Char bir değişkenin tutabileceği maksimum değer 255 dir. 257 mod (255 + ) = Integer overflow ve Buffer overflow ile ilgili örnek #include <stdio.h> #include <string.h> int main(int argc,char **argv){ int i; unsigned short int a; char *ptr="integer overflow and buffer overflow"; i = atoi(argv[]); a = i; if(a > strlen(ptr)){ [] printf("length is too long"); return -; printf("character: %c",ptr[i]); [2] #./hello 6 Character: r #./hello 65535 length is too long #./hello 65536 Segmentation fault(core dumped) Son örnekte daha önceden bahsettiğimiz sorundan dolay segmentation fault oluştu.65536 değeri 65535 değerinden daha büyük olduğu için word around işlemi sonucunda aşağıdaki değer elde edilir. 65536 mod (65535 + ) = 0 Bundan dolayı [] ile belirtilen yerde 0 > strlen(ptr) şartın sonucunda if-else yapısının içine girmek yerine [2] ile belirtilen satıra gelmektedir.

2. Aritmetik overflow Bir integer sayının tutabileceği maksimum değerinden daha büyük bir değer saklamaya çalıştığımız zaman word around yapıldığını biliyoruz.buna benzer bir örneği aşağıdaki işaretli integer bir sayı için inceleyelim. #include <stdio.h> int main(){ short int a=32767; a = a+; printf("%d", a); #./signedint -32768 Yukarıdaki örnekte bir short integer sayının tutabileceği maksimum pozitif değer atanmıştır. Biz bu sayıya eklediğimiz zaman negatif bir değer almaktadır. Yukarıdaki işlemi ikilik sayı sistemi ile bakalım 32767 -> 0 + 000 0000 0000 0000 Daha önceden bahsettiğimiz gibi bilgisayarda negatif sayıların ifade edilmesinde sayının en yüksek değerli bitinden (burada 6. bit) yararlanarak ifade edilmekteydi. Bu bit ise negatif sayı anlamına gelmektedir. İkilik sitemde de görüldüğü gibi işlemin sonucunda sadece pozitif sayının sınırları aşılmaktadır ve negatif bir sayıyı ifade etmektedir. Burada 6 bitin dışına çıkılmamaktadır fakat değişkenimiz unsigned olmadığı için sorun oluşturmaktadır. Yukarıda belirttiğimiz sorun bir bufer overflow sorununa da sebep olabilir. Daha önceden yaptığımız örneğin aynısı burada da geçerlidir fakat unsigned short int değişken tipini signed short int yapmamız gerekir. #include <stdio.h> #include <string.h> int main(int argc,char **argv){ int i; short int a; char *ptr="integer overflow and buffer overflow"; i = atoi(argv[]); a = i; if(a > (short int)strlen(ptr)){ [] printf("length is too long"); return -; printf("character: %c",ptr[i]); [2] #./hello 32768 Segmentation fault (core dumped)

Burada a değişkenin değeri -32768 olacaktır. Bir diğer örnek ise minimum negatif sayının sınırlarının aşılması ile ilgilidir. Aşağıdaki kodu inceleyelim. #include<stdio.h> int main(){ char c = 4; c = c - 255; printf("%d",c); #./neg 5 Yukarıdaki örneği ikilik sistemde incelersek: 4 255 ile 4 + (-255) aynı anlama geldiğinden 4 -> 0000 000 255 -> -255 i elde etmek için e tümleyenine ekleriz. 255 sayısının e tümleyeni -> 0000 0000 + 0000 000? Görüldüğü gibi sonuç çıkmıştır ve -255 elde etmek için 8 bit yeterli değildir. Fakat işlem sonucunda 4 + = 5 program sonlandığında sonuç 5 olacaktır. Bunun sebebi ise char tipinin tutabileceği minimum -28 dir. Biz bu değerin çok altına düştüğümüz için sonuç yanlış çıkmıştır. Exploit char buf[00]; void copying(char *str, int len){ if(len > sizeof(buf)){ [] return -; memcpy(buf, str, len); [2] Bu kod buffer overflow sebep olabilir ve bunun sonucunda segmantation fault verebilir. Kodun [] kısmında len değerine biz - yolladığımızda (hexadecimal olarak 0xffffffff) herhangi bir sorun vermeden kodun [2] kısmına geçer. Burada ise buffer overflow sebep olur. Memcpy fonksiyonun len parametresi unsigned integer dır. Fakat biz len parametresine - yolladığımız için bunu negatif bir sayı olarak yorumlamaz. Buradaki negatif sayı, unsigned integer da maksimum değer olarak yorumlanır. Yani - değilde 4.294.967.295 olarak yorumlanır ve str değişkeninden 4gb lık veriyi buf dizisine kopyalamayı çalışır.bu da segmentation fault hatasına sebep olur.

Kaynaklar: http://en.wikipedia.org/wiki/integer_overflow http://www.enderunix.org/docs/bof.txt