13 Mart 2017 Pazartesi

x86 assembly emirleri

yazı ileriki tarihlerde yeni emirlerin eklenmesi ile güncellenecektir.

~~~~~~~~~~~~~~~~~~~~~~~~~~HEDEF~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

x86 assembly emirleri için örneklemeler/kodlamalar yapmak.kodlar çok sofistike değil aksine emirleri anlamak için yazılacak olan basit kodlar olacaktır.



~~~~~~~~~~~~~~~~~~~~~~STD / CLD / REP~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


STD Instructionı DF bayrağını setler.(DF=1)

CLD Instructionı DF bayrağını temizler.(DF=0)

REP Instuctionı, ecx içeriği sıfır olana kadar bir loop içerisinde SI ile belirtilen kaynağı DI ile belirtilen hedefe taşımaktadır.

her transfer sonrası ecx registerı bir azaltılır ve zero flag test edilir.

DF(Direction Flag) string operasyonlarda veya block transfer işlemlerinde veriler transfer edilirken
source address ve destination adress için arttırma veya azaltma yapmakta kullanılır.

buradaki kodu yazıp gnu debugger ile basit bir inceleme yaparak sanırım daha rahat anlayabiliriz.
global  _start
        section .text
_start:
        lea esi,[fun]
        lea edi,[message]
        mov ecx,12
        std
        rep movsb
       section .data
mesaj    :db   "Hello,World",0
fun        :db  "forfunandprofit",0

----------------> nasm -f elf32 forfun.asm -o forfun.o
----------------> ld -melf_i386 -o fun forfun.o

--------------------------------------------------------------------------------------------------------------------------
root@kali:~/Desktop/stuff# gdb -q fun
Reading symbols from fun...(no debugging symbols found)...done.
gdb-peda$ b _start
Breakpoint 1 at 0x8048080
gdb-peda$ r

gdb-peda$ p &fun
$1 = (<data variable, no debug info> *) 0x80490a0

gdb-peda$ p &message
$2 = (<data variable, no debug info> *) 0x8049094

ESI: 0x80490a0 ("forfunandprofit")
EDI: 0x8049094 ("Hello,World")

=> 0x8048092 <_start+18>: rep movs BYTE PTR es:[edi],BYTE PTR ds:[esi]

ECX keyfi olarak 12 seçilmiştir.12 karakter source(kaynak)dan okunup destinationa(hedefe)
transfer edilecek/kopyalanacaktır.

REP instructionı çalıştıktan sonra ESI ve EDI değerleri.

ESI: 0x804909f  // 1 azalma
EDI: 0x8049093 // 1 azalma

kısacası STD instruction  ile DF clear edildiğinden  azalan yönde veri transferi gerçekleştiriliyorken CLD ile DF  setlendiğinden artan yönde veri transferi gerçekleştirilecektir.

dikkat ederseniz ESI ve EDI ikisinde de azalma gerçekleşiyor  bu durumu gnu debugger üzerinde adreslere göz atarak daha rahat anlayabilirsiniz ve neden "forfundandprofit" ilk harfi hariç "Hello,World" stringini ezemediğimizide rahatlıkla görebilirsiniz.

bu konu için little endian ve big endian arasındaki o küçük farka bakmanızda basitliği anlamanızda sizlere daha fazla yardımcı olacaktır.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~




EOF

Hiç yorum yok:

Yorum Gönder