Root > Documents > Web Güvenlik Açıkları > Assembler (4)
Cyber-Warrior.Org \ Doküman \ Web Güvenlik Açıkları > Assembler (4)
Madde
  Yazar : «¥¡g¡t€®»
  Date : 23.11.2004 16:16:30
 
# Assembler (4)
 

Assembler komutlari

Bu kadar genel ve ön bilgi sonrasi artik komutlari tanimaya baslayabiliriz. Assembler komutlari genel amaçli komutlar, mantiksal komutlar, sistem komutlari gibi bölümlere ayrilmaktadir.

Daha önce söz ettigimiz MOV, LEA komutlari registerleri yükleme, adresleme veya degerini bir yere yazdirma için kullanilir. Genel kullanilis sekli : MOV register, deger veya MOV [adres],register seklindedir.  Bu komut birden fazla registeri bir arada kullanmayada olanak verir. Örnegin : MOV register, [register+register] gibi.

mov register,[adres]
mov [adres],register
mov [adres+register],register
mov register, [adres+register]
mov register, [register+register]

gibi burada sadece registerler arasinda toplama degil çikartma ve çarpma islemide yapilabilimek
tedir.

LEA komutu hem registere deger yüklemek için hemde dogrusal bir hafiza adresinin alinmasi için kullanilir.

lea register, adres
lea register, [adres]
lea register, register*4
lea register, register+10h

gibi kullanilir. Ileride uygulamali örneklerde MOV ile LEA arasindaki farki daha iyi göreceksiniz.

Ayrica LES, LDS, LFS, LSS, LGS  gibi genelde gerçek modda ve yüksek düzeyli korumali mod mimarisinde kullanilan  register yükleme komutlarida vardir. Bunlar interrupt ve segment ayarlamalarinda kullani
lir. Korumali modda Segment seçici görevini yerine getirir. Su andaki sistemlerde çok fazla kullanim alanlari yoktur.

Buradan sonra çok kullanilan önemli komutlari inceleyecegiz. Bazi komutlar çalistiktan sonra birden fazla komutu etkileyebilir. Bunlari m
ümkün oldugunca açiklayacagim. Ayrica mümkün oldugunca her komut için örnek verecegim.

Registerleri degistiren, aktaran, ekleyen baska komutlarda vardir.

XCHG KOMUTU

XCHG komutu iki registerin yada registerler bir yerin yer degisimi saglar. Bu komut 4-5 tane ayri komut yapilacak bir islemi tek basina gerçeklestirir. Kullanilisida çok basittir.

XCHG REG1, REG2

XCHG REG, [ADDR]

XCHG [ADDR],REG

gibi kullanilir. Buradaki tek sart yer degisecek register veya adresin ayni bit uzunluguna sahip olmasidir.

XLAT  KOMUTU

XLAT komutu esas olarak BX (veya EBX) registeri esas alarak çalisir. Buna göre BX registerle gösterilen bir adresteki bilgiyi almak için AL registeri BX register ile toplar ve gösterdigi noktadaki bilgiyi (8 bitlik) alip AL register yükler. Bu islemde sadece AL registerin degeri degisir.

Örnegin:

yazi   db \'ABCDEFGH\',0
...

        mov al,3           ; AL = 3
        lea ebx, yazi    ; EBX = yazi [ABCDEFG]
        xlat                  ; EBX+AL = [- - *---]   AL= \'C\' olur

XLAT komutu bazi zamanlar XLATB olarakda geçer ve bunlar farkli degil ikiside aynidir.

MOVSX ve MOVZX komutlari

Bu komutlarda diger komutlar gibi kodu kisaltmak ve daha hizli islem yapmak içindir. MOVZX komutu bir adresdeki 8 bitlik sayiyi 8 bit registere yükler ama 8 bit disindaki bitleri resetler (sifirlar) Böylece elimizde 8 bitlik tertemiz bir deger olur. MOVSX komutuda benzer olarak registeri yükler ve diger bitleri temizler ancak bu islem 16 bitten 8 bite veya 32 bitten  8 bite olmaktadir.

deger2  db 10
....
mov eax,12345678h  
                 ; eax = 12345678
movzx  eax, byte ptr [deger2]     ; deger2 = 10, eax =10 oldu

Yuikaridaki örnekte önceden EAX registere 12345678 gibi 32 bitlik bir deger girdik. [deger2] adresinin 8 bit olduguna dikkat edin. MOVZX komutundan sonra EAX r
egister sadece 10 degerini alacaktir. Eger MOVZX kullanmadan normal bir AL register yüklemesi yapsaydik EAX registerin sadece AL kismi degisecek ve EAX 12345610 degerini alacakti.

Kombine Veri komutlari (LODS, MOVS, CMPS, STOS, SCAS)

Bu komutlar birden fazla registerle, birden fazla kere islem yapmayi amaçlayan güçlü komutlardir. Bunlar tekil olarak yada REPZ, REPNZ, REPNE gibi bu komutlara özel tahsis edilmis yardimci komutlar ile beraber çalisir. Hepsi yanina yapacagi bit sayisina göre ek alirlar. Bu komut kullanacagi bit degerine göre yanina simge alir. Ancak bu bizim tarafimizdan tahsis edilen bir özellik degildir. Bu standart komut setinin ayri ayri ayirdigi opkodlardir. Bu opkodlar konunun sonunda görecegimiz REP komutu ile kullanilisinda her defasinda yapilacak islem miktarinida ayarlar.

B = byte  (8 bit) bazinda islem
W= word (16 bit) bazinda islem
D= dword (32 bit) bazda islem

Öncelikle anlasilabilmesi için tekil kullanimlarini sonrada sayaçli kullanimlarini inceleyecegiz.

LODS komutu

Bu komut yanina aldigi eke göre 8 ile 32 bit arasinda islem gücü kazanir. Temel görevi SI (yada ESI) registerin gösterdigi noktadaki degeri alip bit degerine göre A (AL, AX, EAX) registere yüklemektir. Ayrica LODS komutu degeri yükledikten sonra SI registerin degerini kullanilan bit degerine göre arttirarak sonraki veriye göre ayarlamis olur. Bu byte için 1, word için 2 ve dword için 4 byte otomatik olarak toplanacak demektir. Daha önce gördügünüz XLAT komutuna benziyor olmasina karsin LODSB çok farklidir. Asagida verilen ve diger örneklerde verilen bit degerleri gerçek modda veya korumali modda aynidir. Kullanim ihtiyacina göre hepsi kullanilabilir.

LODSB  = 1 byte islem için (8 bit)
LODSW = 2 byte islem için  (16 bit)
LODSD = 4 byte islem için (32 bit)

Örnek:

ornekyazi   db \'ASM GENEL\',0
.....
lea esi,ornekyazi   ; ornekyazi noktasinin baslangiç adresini ESI registere yükledik.
lodsb                     ; al registere ilk harf olan \'A\' harfi yüklendi. ESI register byte olarak kullandigimiz için 1 artti.

Eger ilk iki har
fi alip ax registere yüklemek isteseydik lodsw kullanacaktik. Yine ilk 4 byte için lodsd kullanacaktik.

MOVS komutu

Bu komutta LODS komut gibi yanina aldigi B,W,D takilari ile ayri bir opkod halini alir ve buna göre bitte islem yapar. MOVS komutu DI (veya EDI), SI (veya ESI) ve registerleri ile beraber çalisir. SI kaynaktir yani aktarilacak verini adresini gösterir. DI ise hedeftir gidecegi yeri gösterir. Komut sonrasi her iki registerde kullanilan bit degerine göre ekleme olur ve yeni yeri gösterirler.


buf1    db \'YAZI\',0
buf2    db 0,0,0,0
......
lea esi,buf1    ; buf1 = \'YAZI\'
lea edi,buf2   ; buf2= 000000000
movsd           ; buf1 = \'YAZI \' ve buf2 = \'YAZI


Bu islem sonunda buf1 adresindeki veri buf2 bölgesine aktarilir. buf2 bölgesinde bir degisme olmaz, ayni kalir. Burada eger MOVSB kullanilmis olsaydi sadece ilk harf aktarilacakti. Eger MOVSW kullanilmis olsa o zaman ilk iki veri aktarilacakti. Bunlar kullanilan bit degerlerine bagli.

CMPS Komutu

CMPS komutu ileride görecegimiz karsilastirma komutunun kombine bir seklidir. Bu komut yine tekil olarak digerleri gibi yanina aldigi ek ile orantili olarak bit sayisi kadar islem yapar. Yine bu komut SI (veya ESI) ve DI (veya EDI) registerler ile birlikte çalisir.Bu komut tüm karsilastirma ve test komutlari gibi bayrak registeri etkiler. Bu komutu kisaca SI register ile gösterilen bölgeyi DI ile gösterilen bölge ile karsilastirir diye açiklayabiliriz. Bu islem tamamen hafiza bölgesi ile ilgilidir. Bu komut ileride görecegimiz karsilastima komutlari gibi registerler karsilastirmasi yapmaz. Karsilastirma sonucunu  ZF (zero flag) ile aliriz. Eger iki bölgede verdigimiz bir degeri kadar karsilastirilmasi sonucu ayni ise ZF set (1) olur. Eger yanlis ise ZF reset (0) olur. Bunu nasil kullanacagimizi ileri sartli atmala komutlarinda görecegiz. Simdilik asagidaki örnek bunun nasil kullanildigi konusunda  bir fikir verebilir.

buf1  db 01,02,03,04
buf2 db 02,03,01,04
....
lea esi, buf1        ; asil bölge
lea edi, buf2       ; karsilastirilan bölge
cmpsd                 ; dword (32 bit ) olarak karsilastirma
jz dogru              ; eger ayni ise  "dogru " etiketli  yere atlar. Degilse devam eder.
....

STOS Komutu

Bu komut A register (AL, AX, EAX) ile DI register (veya EDI) ile beraber çalisir. STOS komutu digerleri gibi yanlarina aldiklari isaret ile opkod eslenir ve bu eslesmeye göre islemde bit seviyesi kullanir. STOS komutu A registerdeki degeri DI registerin gösterdigi bölgeye aktarir.

buf1   db 00,00,00,00
......
lea edi, buf1
mov al,89h
stosb

Bu islem sonunda stosb kullandigimiz için 1 byte (8 bit) bir yazma olacak ve buf1 db 89h,0,0,0 seklinde olacaktir. Eger STOSW komutu kullanmis olsaydi 2 byte yazacakti ve dolayisiyla bu AX register olacakti. Ayni seklide STOSD kullansaydik 4 byte olacakti ve bu EAX register olacakti.

SCAS Komutu

SCAS komutu aramak - taramak kelimesinin kisaltilmisidir ve yaptigi islemde taramadir. Tek basina pek bir islevi yoktur. Asil olarak asagida göreceginiz gibi REP tekrarlaticisi ile güçlü bir arama - tarama islevi kazanir.

REP komutunu LODS, MOVS, CMPS, STOS ve SCAS  ile kullanilislari

REP komutu yukarida gördügümüz 4 sinif komut ile kombine çalisarak onlarin tek basina yaptiklari isi grup halinde ve istenilen sayida yapilmasini saglar. Burada önemli olan sayidir ve sayiyi CX (veya ECX) register ile belirtiriz. Diger kullanimlar her komut için yukarida anlattigim gibi ilgili registerlere ve kullanilan alanlara baglidir. REP komutu bir döngü olusturur ve verilen komutu belirlenen CX (veya ECX) kadar yapar.

REP komutu REPZ, REPE, REPNE olar
ak döngüyü kontrol altina alma olanagida vardir. REPZ ile CX (yada ECX) 0 oluncaya kadar devam et anlamindadir. REPE yine CX register esit oluncaya kadar ve REPNE ise esit olmayincaya kadar anlamindadir. REPZ genelde çok kullanilir ama DF bayragi degistirilerek tersine islem ile digerleride rahatça kullanilabilir.

MOVS ve REP kullanilisi

MOVSB daha önce anlattigim gibi kombine veri aktarma görevini yerine getiriyordu. REP komut ile SI ile belirtilen hafiza bölgesinden DI ile belirtilen hazifa bölgesine CX kadar aktarma yapar. Örnegin:

lea esi,buf1
lea edi,buf2
mov ecx,100h
repz
movsb
....
buf1 bölgesinden buf2 bölgesine 100h byte seklinde aktarma yapiliyor. Eger MOVSB yerine MOVSW kullanlirsa aktarma Word (16 bitlik) olacak ve burada kullandigimiz ECX = 100h * 2  olacak. Çünkü her sayimda 1 degil 2 veri aktarmis olacagiz. Ayni sekilde MOVSD kullanirsak 32 bitlik bir aktarma komutu kullandigimiz için 100h * 4 olacaktir.

CMPS ve REP kullanilisi

CMPS komutuda MOVS komutu gibi REP komutu ile beraber kullanilinca döngü içerisinde kontrol saglar. Bu komutun en büyük avantaji çok uzun veri yada yazilarin rahatlikla karsilastirilabilmesidir. Normalde bu komut olmasa döngü içinde tek tek karsilastiran bir program yazmak gerekir. Ancak REP CMPS kombinasyonu ile güçlü bir kontrol mekanizmasi olusturulabilir.

str1        db \'mumemu.kolayweb.com\',0
str2        db \'yigiter\',0
.....
lea esi,str1
lea edi,str2
mov ecx,8
repz
cmpsb
jz ayni
:::::::::

Burada str1 bölgesi ile str2 bölgesi karsilastiriliyor ve karsilastirma uzunlugu 8 byte. Eger ayni ise JZ AYNI ile baska yere atlaniliyor eger degilse devam ediliyor. Buradaki karsilastirma sonucunda ZF (Zero flag = sifir bayragi) etkilendigi için istenildigi gibi düzenlenebilir.

STOS ve REP kullanilisi

STOS komutu doldurma komutu oldugunu daha önce anlattim. Bu komut DI (veya EDI) komutu ve A (AL, AX, EAX) ile beraber kombine çalisir.DI ile belirtilen hazifiza bölgesini A register ile doldurulur. Burada doldurma yine CX (veya ECX) sayisi kadardir. Yine MOVS komutunda anlattigim gibi kullanilan registerin biti ve komutun çalisma biti doldurma alanini büyütür. Eger ECX=100h verip STOSW kullanirsak 100h * 2 kadar olacaktir.

buf1        db 0,0,0,0,0,0,0,0,0,0,0,0,0
....
lea edi, buf1
mov ecx, 5
mov al,99h
repz
stosw

Burada buf1 bölgesini 99 sayisi ile dolduruyoruz. Normalde ECX ile 5 kere tekrarlanacak olarak verildigi halde STOSW kullandigimiz için 5 * 2 = 10 bytelik bir doldurma olacaktir.

LODS ve REP kullanilisi

LODS ile REP komutu genelde döngü içerisinde kullanilir. Tek basina kullanilmasi SI (veya ESI) register ve CX (veya ECx) register ile saglanir ve yine digerlerinde oldugu gibi kullanilan bit uzunluguna göre opkod alir. Kullanilan bit uzunlugunca A register (AL, AX, EAX) SI registerdeki veriyi alir.

buf1    db \'ASM GENEL\'
....
le
a esi, buf1
mov ecx,5
repz
lodsb

bu islem sonucunda ESI register ECX register kadar veriyi buf1 adresinden alip AL registere aktarir.

STOS ve REP  kullanilisi

STOS komutu daha önce anlattigim gibi arama - tarama komutudur. Bu komut DI (veya EDI) register ile belirtilen bölgede CX (veya ECX) kadar A registerdeki (AL, AX, EAX) degeri arar. 8, 16 ve 32 bitlik bir veriyi istedigimiz hafiza alaninda arama konusunda bir hayli hizlidir. Yine digerlerinde oldugu gibi yanina aldigi ek ile opkodu sekil alir ve dolayisiyla arama degerinin biti buna göre ayarlanir. STOSB byte, STOSW word, ve STOSD dword aramasi yapar. Bu komutta aranilan deger bulundugu takdirde döngü sonlanir ve DI register aranilan degerin oldugu hafiza adresini gösterir.

buf1     db \'aranilan harfler CW olsun\',0
.....
lea edi buf1
mov ecx,10
mov ax,\'CW\'
repz
scasb

Bu islem sonunda buf bölgesi aranacak ve \'CW\' harflerinin oldugu adreste duracak. Sonuçta bize DI register ile adres vermis olacak.

   
   
Cyber-Warrior TIM All Legal and illegal Rights Reserved.\CWDoktoray 2001©