- 8 Eyl 2016
- 1,647
- 1
- 1,007
Merhabalar, Blue Team ekibimizle beraber Assembly ders serimizi başlattık. İleri seviye malware analiz konuları öncesi Assembly bilgisine sahip olmamız gerekiyor. Ben size bu konuda Assembly de veri aktarım komutlarından bahsedeceğim. Örneklerimi x86 ve 8086 mimarilerine göre yapacağım.
MOV KOMUTU
MOV komutu işlev olarak kopyalama görevini yerine getiriyor. Verilerin kaydedicilere, belleğe atılmasını sağlamaktadır. MOV komutu yapı olarak hedeften kaynağa doğrudur.
MOV hedef, kaynak
Burada hedef kısmı verinin aktarılacağı adresi ifade ederken kaynak ise aktarılacak veri anlamına geliyor. Üst düzey dillerdeki değişken kavramını aslında bu olaya benzetebiliriz. Örneğin bir değişkene 5 değerini atıyorsunuz hedefiniz atanan değişken, kaynağınız ise atanan değer oluyor.
Burada şu ayrıntıya da dikkat edelim kaynaktan hedefe aktarım yapılırken kaynağın değeri asla kaybolmaz. Tıpkı masaüstünde yer alan dosyayı kopyalayıp farklı bir dizinde yapıştırmak gibi düşünebiliriz. Her iki tarafta veriye sahip oluyor. MOV komutumuzla alakalı birkaç örnek yazıp konuşmaya devam edelim.
Burada hedefim EAX registerı(Registerlar ile ilgili ayrı bir konumuz bulunmaktadır. Assembly kategorisine göz atabilirsiniz.) kaynağım ise 25h değeri hexadecimal olarak 25 değerini EAX registerına aktarıyor.
Burada 4142 değerini yine aynı şekilde EAX registerına aktarıyorum. 10 ve 2E değerlerinin register üzerine düştüğünü görüyoruz.
EAX registerına signed sayı tipinde baktığım zaman 4142 değerini net bir şekilde görebiliyorum. Bunu daha net bir şekilde EMU8086 emulatörümü açarak da size göstermek istiyorum.
Burada 8086 mimarisinde işlem yaptığım için AX yazıyorum. Bu registerımda kendi içerisinde 8bitlik iki bölüme ayrılıyor. Sol tarafta register alanına baktığım zaman H ve L bölümleri yani AH, AL registerlarına sırayla 10 ve 2E değerleri yani gönderdiğim 4142 değerleri düşmüş. Şu alanlara bir tıklayıp görmeden önce sağ tarafta MOV AX, 102Eh atamasını görüyorum. Benim gönderdiğim 4142 değeri hexadeciimal olarak AXe atanıyor.
Burada registerıma gönderdiğim değerlerin hex olarak yazıldığını ve decimal olarak da karşılıklarını görüyorum.
Burada 10 ve 2E hexadecimal değerlerin ascii karşılıkları da bu şekilde. Bu kavramlarda kafanızda soru işareti kalıyorsa ASCII, Hexadecimal, decimal, sayı tabanları, gösterimler konularına göz atmanızda fayda var.
E madem registera hexadecimal ekleyerek atıyorsun biz de 4142h diyerek hexadecimal olarak direkt 4142 değerini registerda görmek isteyebiliriz.
Aynı olayı 8086 mimarisine uygun olarak görseldeki gibi yazıyorum. Burada kodumu single step diyerek adım adım işleyip registerlarımı inceliyorum. Zaten ilk step de mov komutu ile kopyalama işlemini gerçekleştiriyor.
Step back komutu ile atama işlemini gerçekleştirmeden duruma baktığım zaman 1001 ve 1002 offset değerlerinde 42 ve 41 hexadecimal değerlerimi görüyorum. Yani bu offsetler bir sonraki step de işlenecek.
RAM üzerinde ilgili değerlerimi görüyorum.
Yukarıdaki kod bloğunu incelersek ilk olarak ax registerına 5 daha sonra 4 değeri sırayla atanacaktır.
İlk blok gerçekleşti ve ax 5 değerini aldı. Daha doğru bir ifadeyle 8 bitlik bu veri 8 bitlik AL registerına düşüyor.
Tekrar step dedik ve 4 değerinin AL içerisine düştüğünü görüyoruz. Buradaki olay da little endian, big endian kavramlarını çağrıştırıyor, ilerde bahsedilecektir. Bu örnekler, kullanımlar çeşitlendirebilir biz diğer komutlarımıza geçelim.
XCHG KOMUTU
Bu da takasçımız diyebilirim. Ya da benim olanı sana, senin olanı bana veriyor da diyebilirim. Örneği gönder gelsin.
Anlatmaya gerek yok işte görüyorsunuz. EAX ve ECX değerlerini birbiriyle takas etmişler.
INC DEC KOMUTLARI
Burada EAX registerı 5 değerine sahipken inc komutu ile değeri 1 artıyor ve 6 oluyor. Burada direkt programı run ettiğimden dolayı doğal olarak inc edilmiş halini direkt görüyorum. Debugger vasıtasıyla Step step incelersem 5 değeri ile açılışı yapıp 6 ile kapanış yaptığını görebilirim. DEC komutu ise tam tersi azaltma işlemini yapıyor.
LEA KOMUTU
Burada sayilar adında define byte yani 1 byte=8bitlik değerlere sahip hexadecimal değerleri tutan bir dizim var. Lea komutu ise bx registerına sayilar dizisinin offsetini yani başlangıç değeri olan 10h değerini atıyor. Yani bu komutumuz kaynağın offset değerini hedefe aktarır.
XLAT KOMUTU
Şimdi burada adım adım açıklarsam BX registerına sayiların offseti yani 25 değeri taşınıyor. mov komutu al içine 1 atıyor ve xlat bu değeri 1 artırıyor ve bu da sayilar dizisi içindeki ilk ofsetten sonra gelen 26 değerini al içerisine kopyalıyor.
Temel olarak aktarabileceğim veri aktarım komutları bu şekildeydi. Okuduğunuz için teşekkürler.
MOV KOMUTU
MOV komutu işlev olarak kopyalama görevini yerine getiriyor. Verilerin kaydedicilere, belleğe atılmasını sağlamaktadır. MOV komutu yapı olarak hedeften kaynağa doğrudur.
MOV hedef, kaynak
Burada hedef kısmı verinin aktarılacağı adresi ifade ederken kaynak ise aktarılacak veri anlamına geliyor. Üst düzey dillerdeki değişken kavramını aslında bu olaya benzetebiliriz. Örneğin bir değişkene 5 değerini atıyorsunuz hedefiniz atanan değişken, kaynağınız ise atanan değer oluyor.
Burada şu ayrıntıya da dikkat edelim kaynaktan hedefe aktarım yapılırken kaynağın değeri asla kaybolmaz. Tıpkı masaüstünde yer alan dosyayı kopyalayıp farklı bir dizinde yapıştırmak gibi düşünebiliriz. Her iki tarafta veriye sahip oluyor. MOV komutumuzla alakalı birkaç örnek yazıp konuşmaya devam edelim.
Burada hedefim EAX registerı(Registerlar ile ilgili ayrı bir konumuz bulunmaktadır. Assembly kategorisine göz atabilirsiniz.) kaynağım ise 25h değeri hexadecimal olarak 25 değerini EAX registerına aktarıyor.
Burada 4142 değerini yine aynı şekilde EAX registerına aktarıyorum. 10 ve 2E değerlerinin register üzerine düştüğünü görüyoruz.
EAX registerına signed sayı tipinde baktığım zaman 4142 değerini net bir şekilde görebiliyorum. Bunu daha net bir şekilde EMU8086 emulatörümü açarak da size göstermek istiyorum.
Burada 8086 mimarisinde işlem yaptığım için AX yazıyorum. Bu registerımda kendi içerisinde 8bitlik iki bölüme ayrılıyor. Sol tarafta register alanına baktığım zaman H ve L bölümleri yani AH, AL registerlarına sırayla 10 ve 2E değerleri yani gönderdiğim 4142 değerleri düşmüş. Şu alanlara bir tıklayıp görmeden önce sağ tarafta MOV AX, 102Eh atamasını görüyorum. Benim gönderdiğim 4142 değeri hexadeciimal olarak AXe atanıyor.
Burada registerıma gönderdiğim değerlerin hex olarak yazıldığını ve decimal olarak da karşılıklarını görüyorum.
Burada 10 ve 2E hexadecimal değerlerin ascii karşılıkları da bu şekilde. Bu kavramlarda kafanızda soru işareti kalıyorsa ASCII, Hexadecimal, decimal, sayı tabanları, gösterimler konularına göz atmanızda fayda var.
E madem registera hexadecimal ekleyerek atıyorsun biz de 4142h diyerek hexadecimal olarak direkt 4142 değerini registerda görmek isteyebiliriz.
Aynı olayı 8086 mimarisine uygun olarak görseldeki gibi yazıyorum. Burada kodumu single step diyerek adım adım işleyip registerlarımı inceliyorum. Zaten ilk step de mov komutu ile kopyalama işlemini gerçekleştiriyor.
Step back komutu ile atama işlemini gerçekleştirmeden duruma baktığım zaman 1001 ve 1002 offset değerlerinde 42 ve 41 hexadecimal değerlerimi görüyorum. Yani bu offsetler bir sonraki step de işlenecek.
RAM üzerinde ilgili değerlerimi görüyorum.
Yukarıdaki kod bloğunu incelersek ilk olarak ax registerına 5 daha sonra 4 değeri sırayla atanacaktır.
İlk blok gerçekleşti ve ax 5 değerini aldı. Daha doğru bir ifadeyle 8 bitlik bu veri 8 bitlik AL registerına düşüyor.
Tekrar step dedik ve 4 değerinin AL içerisine düştüğünü görüyoruz. Buradaki olay da little endian, big endian kavramlarını çağrıştırıyor, ilerde bahsedilecektir. Bu örnekler, kullanımlar çeşitlendirebilir biz diğer komutlarımıza geçelim.
XCHG KOMUTU
Bu da takasçımız diyebilirim. Ya da benim olanı sana, senin olanı bana veriyor da diyebilirim. Örneği gönder gelsin.
Anlatmaya gerek yok işte görüyorsunuz. EAX ve ECX değerlerini birbiriyle takas etmişler.
INC DEC KOMUTLARI
Burada EAX registerı 5 değerine sahipken inc komutu ile değeri 1 artıyor ve 6 oluyor. Burada direkt programı run ettiğimden dolayı doğal olarak inc edilmiş halini direkt görüyorum. Debugger vasıtasıyla Step step incelersem 5 değeri ile açılışı yapıp 6 ile kapanış yaptığını görebilirim. DEC komutu ise tam tersi azaltma işlemini yapıyor.
LEA KOMUTU
Burada sayilar adında define byte yani 1 byte=8bitlik değerlere sahip hexadecimal değerleri tutan bir dizim var. Lea komutu ise bx registerına sayilar dizisinin offsetini yani başlangıç değeri olan 10h değerini atıyor. Yani bu komutumuz kaynağın offset değerini hedefe aktarır.
XLAT KOMUTU
Şimdi burada adım adım açıklarsam BX registerına sayiların offseti yani 25 değeri taşınıyor. mov komutu al içine 1 atıyor ve xlat bu değeri 1 artırıyor ve bu da sayilar dizisi içindeki ilk ofsetten sonra gelen 26 değerini al içerisine kopyalıyor.
Temel olarak aktarabileceğim veri aktarım komutları bu şekildeydi. Okuduğunuz için teşekkürler.