~~~~~~~~~~~~~~~~~~~~~~~~~~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.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Hiç yorum yok:
Yorum Gönder