Assembly Veri Aktarım Komutları

Pentester

Özel Üye
8 Eyl 2016
1,646
996
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.


zbeut3.png


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.

lHgkQs.png


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.

T0ff73.png


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.

IAxb03.png


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 AX’e atanıyor.

m54l3F.png


Burada registerıma gönderdiğim değerlerin hex olarak yazıldığını ve decimal olarak da karşılıklarını görüyorum.

gn1iEw.png


yd7zin.png


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.

RV3Ndq.png


E madem registera hexadecimal ekleyerek atıyorsun biz de 4142h diyerek hexadecimal olarak direkt 4142 değerini registerda görmek isteyebiliriz.

3eF39p.png


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.

6Q9UNC.png


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.

qeTFgw.png


RAM üzerinde ilgili değerlerimi görüyorum.

0xzvgz.png


Yukarıdaki kod bloğunu incelersek ilk olarak ax registerına 5 daha sonra 4 değeri sırayla atanacaktır.

Rri7DQ.png


İ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.

zB3lvo.png


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.

LSA6np.png


Anlatmaya gerek yok işte görüyorsunuz. EAX ve ECX değerlerini birbiriyle takas etmişler.

INC – DEC KOMUTLARI

YxkR3G.png


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

2TpCUk.png


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

GFxdF3.png


Ş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.
 

#!/

Uzman üye
9 Mar 2016
1,323
2
TEM
Merhaba hocam. öncelikle böyle köklü bir dil olan Assembly'yi kaleme aldığınız için ellerinize sağlık. Assembly'den sonra sizler için de uygunsa özellikle Android'in çekirdek yazılımında kullanılan "C" dili için de bir şeyler yapabilirsiniz. Bildigim kadarıyla "C" diliyle zararlı yazılım analizleri de yapılabiliyordu.
 
Son düzenleme:

Pentester

Özel Üye
8 Eyl 2016
1,646
996
Hocam öncelikle böyle köklü bir dil olan Assembly'yi kaleme aldığınız için ellerinize sağlık. Assembly'den sonra sizler için de uygunsa özellikle Android'in çekirdek yazılımında kullanılan "C" dili için de; bir şeyler yapabilirsiniz. Bildigim kadarıyla "C" diliyle de zararlı yazılım analizleri de yapılabiliyordu.

Teşekkürler. Assembly bir seri halinde gelecek. Ancak C için talebiniz varsa yazılım ekibi o konuda değerlendirme yapabilir. Bizler Assembly seviyesinde inceleyeceğiz programları ileri malware analiz tekniklerinde bu sebepten assembly üzerine çalışıyoruz.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.