Cyber-Warrior.Org \ Doküman \ Web Güvenlik Açıkları > Assembler (1)
| Madde |
| |
Yazar : «¥¡g¡t€®» |
| |
Date : 23.11.2004 16:16:30 |
| |
# Assembler (1) |
| |
Giris
Assembler merkezi islemci olan bütün sistemlerde ve isletim sistemlerinde "kullanici - program - makine" iletisimi saglayan ve sembolik komutlar sayesinde programlamayi sayilar düzeyinden sembollere çikaran bir dildir. Normalde merkezi islemci (CPU) komutlari 1 ve 0 olarak anlar ve buna göre yapilmasi gereken islemleri yerine getirir.Kisacasi Assembler dili bir makine dilidir diyebiliriz…
ASCII mantigi
Herhangi bir EXE dosyaya bir editor ile baktigimiz zaman anlamsiz ve karmasik birçok semboller ve karakterler görürüz. Bunlar o an orada bulunan sayilara karsilik gelen ve ASCII olarak adlandirilan sembollerdir. Bu semboller hem sayilari,hem büyük/küçük harfleri,hemde birçok isareti içerir. ASCII tablosu 256 isaretten meydana gelir ve her sayi karsiligi bir semboldur. Ilk 32 karakter kontrol karakterleri adi verilen ve görülmeyen karakterlerdir.Bunlar yazici, string gibi islemlerde tek baslarina yada birden fazla görev alirlar. Örnegin 7 sayisi ASCII karakterlerinde \'BEEP\' anlamina gelir ve programini zda eger \'deneme yazisi\',7,0 seklinde kullanirsaniz yazi sonrasi bir \'beep\' sesi duyarsiniz. Yada 10 ve ardindan 13 kullanirsaniz yaziniz bir satir asagiya inip paragrafin en basina gelir. Örnegin: \'deneme yazisi\',10,13,0
48 - 58 arasi ise sayilardir. Buna göre:
48 = \'0\' 49 = \'1\' 50 = \'2\' ....
sayi sekillerine denk gelir ve bu standarttir.
Büyük harfler 65\' den baslar 90\' a kadar devam eder. Ayni sekilde küçük harflerde 97 ile 122 arasindadir. Bundan sonra 256 sayisina kadar karsilik gelen karakterler özel karakterlerdir. Bunlarla pek çok sekil olusturulabilir.
Sayi sistemleri
Yukarida verdigim örnekleri inceleyenler ve herhangi bir hex editör ile dosyalara bakanlar bir gariplik oldugunun farkina varmislardir. Hex editörde bütün sayilar iki basamakli ve içinde a,b,c,d,e,f gibi karakterler içeriyor. Ayrica 1 karakterine karsilik gelen sayi yukaridaki gibi 48 degil 30 oldugunu görürler. Iste programlar daha derli toplu oldugu için, ASCII gösterimine daha yatkin oldugu için ve diger sayi sistemlerine göre dah a kullanisli oldugu için "Onaltilik sistem" diye adlandirilan hex (hexedecimal) sistemi kullanirlar. Burada sunu açiklamakta yarar var, hex sistemi sadece kullanicilar ve programcilar içindir. CPU sadece 1 ve 0 dan olusan ikili sistemi (binary) anlar.
Simdi konuyu toparlarsak üç degisik sayi sistemi oldugunu görürüz:
1 - Onluk sayma sayilari (dec) 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16... seklinde devam eden bildigimiz sayi sistemi...
2 - Onaltilik sayilar (hex) 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,10,11... seklinde devam eden ve "a...f" arasi ekstra olarak 6 sayi daha fazlaligi olan sayi sistemi...
3 - Ikili sistem (binary) 0,1 Bu sistemde ya sifir yada bir olacaktir. 0 kapali 1 ise açik mantigindadir. Bu sistem makina dilinin temelini olusturur ve programlamasi ve yazmasi çok oldugu için assembler diline gerek duyulmustur...
Normal sayilar hepmizin ilkokuldan beri ögrendigi sayi sistemidir. Sayi dizilimi 0 ile 9 arasidir ve her 9 sonrasi bir alt basamak bir yükselir.
Onaltilik sistemde toplam basamak yükseltme sayisi 16\' dir. Biz normal sayma sisteminde 9 sayisindan sonra 10 geldigini biliyoruz. Onaltilik sistemde ise 9 sayisindan sonra 0A,0B,0C,0D,0E,0F ve bundan sonra 10 gelir. Dolayisiyla 0A onaltilik sayisi normal sayi sisteminde 10 sayina esit gelir. Ayni sekilde 10hex sayisi normal sayi sisteminde 16 sayisina esit gelir. Kisaca onaltilik sayi sistemi 16\' nin katlari seklinde büyür.
Assembler programlarinda kullanilan sayilar su sekillerde simgelenerek birbirinden ayrilirlar:
- \'d\' harfi yada harfsiz bu bildigimiz onluk sistemde demektir. Eger bir kaynak kodunda sayinin yaninda (önceden bütün sayilarin hex olacagini belirten .radix16 gibi bir komut kullanilmamissa) hiçbir simge yoksa o sayi göründügü degerinde bildigimiz onluk tabanda bir sayidir. Eger onaltilik kurallariyla yazilmis (a,b,c,d,e,f içerikli) ve yaninda hiçbir isaret yoksa derleyici burada \'illegal number\' seklinde bir hata mesaji verir.
-\'h\' harfi ise her zaman onaltilik sistemde bir sayi oldugunu belirtir. Bu durumda normal onluk sistemde bir sayi yazip yanina \'h\' koyarsaniz bu sayi onaltilik olarak kabul edilecek ve yazdiginiz deger degilde onaltilik sistemin degerini alacaktir. Eger onaltilik bir sayi ve yanina \'h\' isaretini koyarsaniz o sayi onaltilik olarak ve verdiginiz degerde k abul edilecektir.
-\'b\' harfi ise ikilik sistemi belirtir ve adi üzerinde sadece 1 ve 0 kullanabilirsiniz. Aksi halde hata mesaji verir. Asagida hesaplamasini göreceksiniz ama önbilgi olarak vermek gerekirse yazmadiginiz basamaklar daima 0 olarak kabul edile cektir.
Örnekler:
323 ----> onluk sayi sisteminde ve degeri 323 323d----> onluk sayi sisteminde ve degeri 323 323h----> onaltilik sayi sisteminde ve degeri 803
02a-----> Hatali sayi. Içinde onaltilik sayi sistemine ait \'a\' kullanilmis ama sayinin ne oldugu belirtilmemis 02ah----> Onaltilik sayi onluk karsilik degeri 42
1110b--> Ikilik sistemde bir sayi ve normalde 00001110b olarak kabul edilir ondalik 14, onaltilik 0e sayisina denk gelir 1310b--> Hatali sayi yaninda \'b\' ile ikilik oldugu belirtilmesine ragmen içinde 3 sayisi mevcut. 1 veya 0 olmak zorunda.
Çevrimler ve hesaplamalar:
Buraya kadar herkes bir fikir sahibi olmustur. Burada da bunlarin nasil ve neden böyle oldugunu görecegiz. Öncelikle sunu belirtmem gerekiyor: onluk zaten biliyoruz ama onaltilik ve ikilik sistem mutlaka bilinmesi gerekiyor. Programlarinizda, denemelerinizde hep bu sistemler kullanilacak. Komutlar hep bu sistemlere göre çalisacak ve bazilari sadece bu sistemlerdeki degerlere göre hareket edecek. Bunun için bir assembler progr amcisinin mutlaka bu sistemleri bilmesi ve kullanmasi gerekiyor.
Normal bildigimiz sayma sayilarinin 0 dan baslayip 1,2,3,4,5,6,7,8,9,10,11... gibi gittigini biliyoruz. Ona onluk sistem adini veren kural ise her 10 sayi sonrasi bir basamak altini basamak atlatmasidir. Onaltilik sistem ise yine 0 dan baslayip 1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,10,11.. seklinde devam eder. Burada görüldügü gibi onaltilik sistem her 16 sayi sonrasi basamak atlatiyor. Ayrica a,b,c,d,e,f olmak üzere 6 tane daha fazladan sayiya sahip. O zaman onaltilik bir sistemde deger 10 ise onluk sistemede o sayi 16 demektir. Yani 16 nin katlari olarak artmaktadir.
10h = 16 20h = 32 a4h = 164 gibi...
Onaltilik bir sayiyi onluk sayiya nasil çeviririz?
Önce en kolay sekliyle baslayalim. Yukaridaki örnekte a4h onaltilik sayisinin 164 oldugunu görüyoruz. a4h sayisina bakinca iki basamaktan oldugunu biliyoruz ve yine biliyoruz ki onaltilik sayi sistemi 16\' nin katlari ile büyür ve \'a\' harfinin onluk sistemdeki degeri 10 , o zaman elimizde 0a +0 seklinde bir sayi var:
0a* 16 + 4 olacak. 0a = 10 olduguna göre: 10 *16+4 = 164
Birinci basamak her zaman kendi degerindedir. Sayi 0ah,0bh,0ch.. olsa bile onluk sisteme çevirilince birlik basamak olarak digerlerine eklenir. Diger basamaklarda ayni bildigimiz matematik kurallarinda oldugu gibi basamak çarpani esas alinarak çarpilir. Nasilki 164 sayisinin 16*10+4 oldugunu biliyorsak onaltilik sistemde de 164 sayisinin 0ah*10+4 oldugunu biliriz.
Daha büyük sayilarda onaltilik sistemden onluk sisteme çevrim söyle yapilir:
Elimizde 03f4ah gibi bir sayi oldugunu farzedelim. Bu sayi "3 - f - 4 - a" olarak 4 basamakli ve onaltilik sistemde. Her zaman sondan basliyoruz ve 2\'1, 2\'2, 2\'3 gibi gidiyoruz. Burada çarpan sayilari daima sabittir.
Basamak Çarpan Üs 2\' ------------- ------------ ------------------- 1 1 1 * 1 10 64 16 * 16 100 256 16 * 64 1000 4096 16 * 256 10000 65535 16 * 4096 100000 1048576 16 * 65535 1000000 16777216 16 * 1048576 10000000 268435456 16 * 16777216
gibi öyleys e bizim sayimizi bulmanin zamani geldi
0ah * 1 = 10 04h * 16 = 16 * 4 = 64 0fh * 256 = 15 * 256 = 3840 03h * 4096 = 03 * 4096 = 12288
Toplam : 10+64+3840+12288 = 16202
Biraz zor gibi gözüksed e alistirma yaptikça daha çok anlasilir. Zaten çogu kez bende büyük sayilarin çevriminde Windows\' un hesap makinasini kullaniyorum. Bunun assembler rutin yazip çevirmek yada _wsprintf gibi bir fonksiyonunu kullanmak aslinda daha kolay. Ama mantiginin bilinmesi gerekir.
Ondalik sayilarin ikili sisteme çevrilisi
Ondalik bir sayiyi ikilik bir sayi sistemine çevirmek çok kolaydir. Öncelikle ikilik bir sayinin 1 ve 0 sayilarindan olustugunu hatirlayalim. Bu düzen nasil olusur? Bir sayi ikiye ya tam bölünür yada kalanli bölünür. Eger tam bölünüyorsa 0, kalanli bölünüyorsa 1 olur. Kalanli bölünme drurumunda 1 olur ve sayidan bir eksiltilerek isleme devam edilir. Örnegin:
22 /2 0 11/2 1 5/2 1 2/2 0 1/1 1
olur ve daima tersden yazilarak ikili sisteme çevrilmis olur. O zaman 22 ondalik sayisi 10110 ikili sistemine esit olur. Bu islem esasen bundan sonraki konuda görecegimiz bitlere ayirma islemidir.
Bit, Byte, Kilobyte, Megabyte, Gigabyte...
Her zaman duyariz su program diskte su kadar kilobyte yer kapliyor diye. Yada yeni bir disk aldim 80gb gibi. Bunlar aslinda datanin uzunlugudur. Yani verinin kapladigi alandir. Bu büyüklükler temeldir ve disk,hafiza, program içinde aynidir. Sadece bit büyüklük olarak farklilik gösterir ancak digerleri hep 1024\' ün katlari olarak artar ve birimlenir.
1 bit en fazla 1 birim olabilir, 1 byte 0 ile 256 arasinda deger alir. 1 kilobyte 0 ile 65535 arasinda deger alir. 1 megabyte 0 ile 4294967295 arasinda deger alir.
Birimler sirasiyla su sekilde küçükten büyüge dogru siralanir: bit, byte, kilobyte, megabyte, gigabyte, terabyte... Burada en küçük birim olan \'bit\' tek basina kendiden sonraki birimin 8/1 ni olusuturur. Kisaca açarsak 1 byte = 8 bittir. Ayni sekilde 2 byte 16 bittir. Bunu söyle göstererek daha iyi anlasilir hale getirebiliriz:
Elimizdeki sayi: 256 ve bu sayinin onaltilik sekli 0FFh, bunu ikili sisteme çevirirsek :
256/2 0 128/2 0 64/2 0 32/2 0 16/2 0 8/2 0 4/2 0 2/2 0 1/1 1
sonucunu elde ederiz. bu durumda 256 sayisi 1 byte ve 8 bitten olusur. Bu 8 tane bitin illaki 1 ve 0 olmasi gerekmez. Sonuçta 8 tane 1 veya 0, 1 byte\'i olusturur. Byte ile beraber bütün üst birimler 1024 \' ün katlari olarak artar.
1024 byte = 1 kb (kilobyte) 1024 kb = 1 mb (megabyte) 10 24 mb = 1 gb (gigabyte) 1024 gb = 1 tb (terabyte)
Seklinde açiklanabilir. Makine dili islemleri CPU\' a ikili sistemde gönderildigini söylemistik. Yukaridaki birimlere bakinca sadece ikili sistemde programlamanin ne kadar zor oludugu görülmektedir. Assembler dili bunun için gelistirilmistir. Kullandigimiz programlar dili veya arabirim ne olursa olsun sonuçta assembler kodlarina döner. Kullandigimiz *.exe ve *.com gibi dosyalar aslinda assembler dilinden olusan makine dilini içerir ve program hafizada çalismaya baslayinca CPU\' a (merkez islem birimi) 1 ve 0 olarak çevrilerek gönderilir. Delphi, C++, VB gibi dillerde kullandigimiz hemen hemen bütün komutlar semboliktir. Bu komutlara karsilik gelen makine komutlari setleri vardirki bunlar sayesinde tekrar tekrar ayni kodlari yazmak yerine daha düzenli ve daha optimize bir sekilde makine dili programlari olusturulabilir. Makine dili assemblerdir. Tüm assembler komutlarina birden "opkod" olarak isim verilir. |
| |
|
| |
|
|