windows 32 bit-asm

85
SÜLEYMAN DEMİREL ÜNİVERSİTESİ SİBER GÜVENLİK LABORATUVARI Windows 32-Bit Assembly İsmail BOZKURT

Upload: ismail-bozkurtr

Post on 21-Mar-2017

198 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: Windows 32 bit-asm

SÜLEYMAN DEMİREL ÜNİVERSİTESİSİBER GÜVENLİK LABORATUVARI

Windows 32-Bit Assembly

İsmail BOZKURT

Page 2: Windows 32 bit-asm

This Tutorial About

SDÜ-CYBERLAB Assembly

Workshop Amacı:Amacımız windows işletim sistemi üzerinde tersine mühendislik yapmak isteyenarkadaşlara kod analiz edilirken işlemlerin sırası, api yapısı ve kullanımı, shellcode yazımı konusunda giriş seviyesinde bir eğitim verektir.

Kullanılan Toollar:• WinDBG• HexWorkshop• Immunity Debugger• GVIM• Notepad++

Kullanılan İşletim Sistemi• Windows XP 32 bit sp3

Page 3: Windows 32 bit-asm

Digits System

SDÜ-CYBERLAB Assembly

Binary Sayı Sistemi• Bilgisayar sistemleri binary sayi sistemi üzerine kurulmuştur.• 0 -> Voltaj 0 Volt, 1 -> Voltaj 5 Volt.• Binary sayi sistemini iyi anlamak, bu eğitimde öğreneceğimiz assembly dili için çok önemli

!• Sayinin binary formatta olduğunu belirtmek için <0b> tagını sayinin başına ekleriz.• 23’ten büyük 2’nin katı olan en yakın sayı seçilir. Bu örnekte [][][][][] slotumuz olur.• [ ] [ ] [ ] [ ] [ ]• • 23 sayısının binary karsılığı hesaplarken 23’e en yakın 2 nin katı secilir ve sayi 1 yada 0

olana dek aynı işlem tekrarlanır.• Çıkartılan 2’nin katlarını boş slotlarımızda 1 degerini veririz.

• 1. Adim : 23 – 16[ = 7• 7 – 4[ = 3• 3 – 2[ = 1[]• 0b[1][0][1][1][1] = 23.

Page 4: Windows 32 bit-asm

Digits System

SDÜ-CYBERLAB Assembly

Hexedecimal Sayı Sistemi

• Hexedecimal sayi sistemi bellek adreslerini ifade ederken kullanırız.• 0x00406010 şeklinde bellekte adresleri görürüz.• Hexedecimal sayi sistemini iyi anlamak, bu eğitimde öğreneceğimiz assembly dili için çok

önemli !• Hexedecimal sayi sistemindeki sayilar: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A[10], B[11], C[12],

D[13], E[14], F[15]• Sayinin hexedecimal olduğunu belirtmek için sayinin başına <0x> tagını ekleriz.

• 0x10111 sayisinin hexedecimal karşığını hesaplarken binary sayinin sağından başlayarak 4’erli gruplar halinde ayırırız.

• 0b0001 ve 0b0111 olur.

• 0b0001 = 1 ve 0b0111 = 7 olur.

• 23 sayısının Hexedecimal karşılığı: 0x17 olur.

Page 5: Windows 32 bit-asm

Logic Operations

SDÜ-CYBERLAB Assembly

XOR Kapısı

Page 6: Windows 32 bit-asm

Logic Operations

SDÜ-CYBERLAB Assembly

OR Kapısı

Page 7: Windows 32 bit-asm

Logic Operations

SDÜ-CYBERLAB Assembly

AND Kapısı

Page 8: Windows 32 bit-asm

Logic Operations

SDÜ-CYBERLAB Assembly

NOT Kapısı

Page 9: Windows 32 bit-asm

Working With Binaries

5 ^ 3 = ?

SDÜ-CYBERLAB Assembly

Click to add text

5 = 0b01013 = 0b0011

101 011

^ ----- 0b111 = 6.

5 = 0b01013 = 0b0011

101 011

| ----- 0b111 = 7.

5 = 0b01013 = 0b0011

101 011

& ---- 0b001 = 1.

XOR OR AND NOT 5 | 3 = ? 5 & 3 = ? !5

5 = 0b0101

101 ! ---- 0b010 = 2.

Page 10: Windows 32 bit-asm

X86 Memory Segments

SDÜ-CYBERLAB Assembly

0xFFFFFFFF

0x00000000

Page 11: Windows 32 bit-asm

x86 Memory Segments

• Stack : Bellek üzerinde bir veriyi tekrar tekrar kullanmak istediğimizde veya bir fonksiyona girdiğimizde fonksiyonların argumanlarını tutmak amacıyla sakladığımız hafıza alanıdır. Register’lardan sonra belleğin en hızlı alanıdır.Stack LIFO(Last In First Out) mantığıyla çalışır. Yani stack’e attığımız son eleman stack’ten ilk alınmaktadır.

SDÜ-CYBERLAB Assembly

Hafızadaki hangi alan ne için kullanılır ?

Page 12: Windows 32 bit-asm

x86 Memory Segments

SDÜ-CYBERLAB Assembly

• İnitialized ???• Örnek üzerinden anlatmak gerekirse:

#include <stdio.h> int main(){

int a; uninitialized int b=5; initialized }

• Heap : Dinamik bellek alanımızdır. Malloc(), alloc(), free() gibi fonksiyonlar ile bu alandan yer isteyip kullanabilir ve alınan alanı geri verebiliriz. Stack’ten farklı olarak bu alanımız FIFO(First In First Out) mantığıyla calisir.• .Text : Assembly kodlarımızı yazdığımız, programcının

kodlarının çalıştırıldıgı alandır.• .bss : data segmentimizdeki uninitialized data’ların tutulduğu hafıza

alanıdır.• .data : data segmentimizdeki initialized data’ların tutulduğu hafıza alanıdır.

Page 13: Windows 32 bit-asm

Binary Add and Sub Operations

SDÜ-CYBERLAB Assembly

22 – 7 = 15 Bu işlemi bilgisayarlarımız nasıl yapıyor ?

22 = 0b101107 = 0b00111

• 0b00111 sayisinin her bir bitini NOT işlemine tabi tutuyoruz. 0b11000• Ardından en değersiz bit’ine 1 ekliyoruz. 0b11001• Şimdi 22 sayisiyla birlikte topluyoruz. 10110 11001 + -------- 1[01111] En baştaki bir değerimiz sayımızın negatif olduğunu belirtir. 0b1111 sayisinin decimal karşığı : 15

Page 14: Windows 32 bit-asm

Signed Numbers Operations

SDÜ-CYBERLAB Assembly

• Bellekte negatif sayilari ifade ederken binary sayının ilk biti ‘1’ ile başlamaktadır. 8 bitlik alanda inceleyelim.

Örneğin: 79 sayisi79: 0100 1111Her bir biti NOT işlemine sokarız.1011 0000 + = 1011 0001 -79 olur.

Page 15: Windows 32 bit-asm

Registers

SDÜ-CYBERLAB Assembly

• EAX : Acumulator Register.• EBX : Base Register. • ECX : Counter Register• EDX : Data Register• ESI : String işlemlerinde string’in indexlerine ulaşmakta kullanılır.• EDI : String işlemlerinde string’in kopyalanmak istenilen adresin indexleri tutar.• ESP : Stack Pointer. Stack’in en üstündeki verinin adresini işaret eder.• EBP : Base Pointer. Fonksiyon arguman ve local degiskenlere ulaşmada

kullanılır.• EIP : Instructor Pointer. Bir sonraki calistirilacak komutun adresini işaret eder.

EAX,EBX,ECX,EDX temelde birbirlerinden hiç bir farkı yoktur.

Page 16: Windows 32 bit-asm

Registers

SDÜ-CYBERLAB Assembly

Page 17: Windows 32 bit-asm

Registers Logic

SDÜ-CYBERLAB Assembly

0 15 31

0 7 15 23 31

EAX(Extended Acumulator Register)

Örneğin:

eax = 0xABCD1234

ax = 0x1234 ah = 0x12 al = 0x34

Page 18: Windows 32 bit-asm

Flag Registers

SDÜ-CYBERLAB Assembly

16 bitlik özel register’lardır.• CF(Carry Flag) Toplama,çıkarma gibi işlemlerde taşan bit bu flage set edilir.• PF(Parity Flag) Binary sayının bitlerindeki 1 sayılarının toplamı çift ise set

edilir.• ZF(Zero Flag) İşlemin sonucu 0 ise bu flag set edilir.Şartlı dallanmalarda

kullanılır.• SF(Sign Flag) İşlemin sonucu negatif ise bu flag set edilir.• TF(Trap Flag) Flag set edilirse program durdurulur.• OF(Overflow Flag) İşaretli sayılar üzerindeki taşma olursa bu flag set edilir.• IF(Interrupt Flag) CPU’nun çeşitli aygıtlardan kesme isteklerini dikkate almak

istenildiğinde bu flag set edilir.• DF(Direction Flag) Bu flag dizgi işlemleri üzerindeki işlemin yönün belirlemek

için kullanılır.

Bazı assembly instruction’ları flagleri set veya reset eder.Örneğin:

xor eax, eax eax = 0xor ebx, ebx ebx = 0cmp eax, ebx işlemi sonucu ZF=0 olarak set edilir.

Page 19: Windows 32 bit-asm

Segment Registers

SDÜ-CYBERLAB Assembly

• Segment register’ları programımızın bilgisayarın belleğe yüklendiği zaman bellek içerisinde oluşturulan bölümlerin başlangıç adreslerini tutar.

• CS(Code Segment) : Programımızın çalıştırılabilir bellek bölgesinin başlangıç adresini tutar

• DS(Data Segment) : Programımız içerisindeki değişkenlerin saklandığı bölümdür.• SS(Stack Segment) : Programımız için ayrılan stack bölümünün başlangıç adresini

tutar.• ES(Extra Segment) : Dizgi işlemlerinde kullanılır.

Page 20: Windows 32 bit-asm

Some Assembly Commands

• MOV : 2 parametre alır. 2.ci parametredeki degeri 1. parametreye kopyalar. Örn: mov eax, 5 ;5 değerini eax registerina kopyaladik• ADD : 2 parametre alır. 2.nci parametre ile 1.nci parametreyi toplar ve 1.nci

parametreye yazar.Örn: mov eax, 5 add eax, 3 ;işlem sonucu eax = 8 olur.

• SUB : 2 parametre alır. 2.nci parametre’den 1.nci parametreyi çıkartır ve sonucu 1.nci parametrede tutar.

Örn: mov eax, 8 sub eax, 5 ;işlem sonucu eax = 3 olur.

• INC : 1 parametre alır. Aldığı parametredeki değeri 1 artırır.• DEC : 1 parametre alır. Aldığı parametredeki değeri 1 eksiltir.

Örn: xor eax, eax inc eax ; işlem sonucu eax = 1 olur.

dec eax ; işlem sonucu eax = 0 olur.• CMP : 2 parametre alır. İki argumanı karşılaştırır ve sonuca göre flagler set edilir.

Page 21: Windows 32 bit-asm

Some Assembly Commands

• MUL: 1 parametre alır. Diğer instructionlardaki gibi basit değil biraz kafa karıştırıcıdır.

Çarpma işlemine sokulan değer kaç bitlik ise(örn:32 bit) işlem sonucu 64 bitlik bir alana yazilir.

Örnek üzerinden anlamaya çalışalım.Örn: mov eax, 0x00000044 mov ecx, 0x00000002 mov edx, 0x41424344 mul ecx ; burada işlemciye ecx registeri

ile eax registerini kısmını çarp. Sonucu edx ve eax

registerlarında tut. İşlem sonucu:eax = 0x00000088ecx = 0x00000002edx = 0x00000000

• mul si : işlem sonucu dx:ax registerlarında tutulur. İşlemin low kısmı ax, high kısmı dx registerinda tutulur.

Page 22: Windows 32 bit-asm

Some Assembly Commands

• DIV(Unsigned Division) : 1 arguman alır. Bölme işlemleri için kullanılır. Genelde bellekte görmeyiz.

• Arguman 8 bitlik ise:Örn: al ax / arg ah ax % arg

• Arguman 32 bitlik ise:Örn: eax edx:eax / arg Bölümün sonucu edx edx:eax % arg Bölümden kalan

• Örn:mov eax, 0x00000044mov edx, 0x00000000mov ebx, 0x00000002div ebx ; eax registeri ile ebx registeri

bölme işlemi gerçekleştirilir. İşlem sonucu eax = 0x00000021,

edx = 0x00000000 olur.

Page 23: Windows 32 bit-asm

Some Assembly Commands

SDÜ-CYBERLAB Assembly

• STOS(Store String): STOSB(Byte):

[edi] aledi’nin ilk byte’ina al’deki degeri atıyoruz.

STOSW(Word):[edi] axedi’nin ilk 2 byte’ina ax’deki degeri atıyoruz.

STOSD(Dword):[edi] eaxedi’nin ilk 4 byte’ina eax’deki degeri atıyoruz.

Bu komut DF(Direction Flag)’e göre EDI registerinin üzerinde gezer. Eger DF reset edilmişse Soldan sağa, set edilmişse sağdan sola doğru hareket eder.

CLD(Clear Direction Flag)STD(Set Direction Flag)

Page 24: Windows 32 bit-asm

Some Assembly Commands

Şartlı Dallanmalar

• Dallanmalar arguman olarak adres alır ! • JMP(Jump) : Belirtilen adrese koşulsuz dallanma gerçekleşir.• JE(Jump if equals) : ZF=1 set edilmişse dallanma gerçekleşir.• JZ(Jump if zero) : ZF=1 set edilmişse dallanma gerçekleşir.• JNE(Jump if not equals) : ZF=0 set edilmişse(reset) dallanma gerçekleşir.• JNZ(Jump if not zero) : ZF=0 set edilmişse dallanma gerçekleşir.• JB(Jump if below)/JC(Jump if carry)/JNAE(Jump if not above or equals) CF=1 set edilmişse dallanma gerçekleşir.• JBE(Jump if blow or equals)/JNA(jump if not above) : CF=0 ise dallanma

gerçekleşir.• Ve çok daha fazlası ...

Page 25: Windows 32 bit-asm

Introduction The Fasm

SDÜ-CYBERLAB Assembly

Neden FASM(Flat Assembler) ?

• Assembly ile proje geliştirme için elverişli.• FASM’ı seviyoruz.• Herhangi bir syntax hatası yapıldığında hatalı satır hata ayıklayıcısı tarafından

programcıya gösteriliyor.• Daha çok FASM FASM FASM

• FASM ile çalışırken bilmemiz gerekenler• .bss, .text, .data gibi segmentlerin tanımlanma şekli• .idata nedir ? Ne işe yarar ? Yeniliyor mu ?• include bulunamadı diyor mu ?• FASM.exe’yi yola(PATH) eklemek nasıl oluyor ?

Page 26: Windows 32 bit-asm

Introduction The Fasm

SDÜ-CYBERLAB Assembly

FASM Yola Ekleme

Page 27: Windows 32 bit-asm

Introduction The Fasm

SDÜ-CYBERLAB Assembly

FASM Yola Ekleme

Page 28: Windows 32 bit-asm

Introduction The Fasm

SDÜ-CYBERLAB Assembly

FASM Yola Ekleme

• ;C:\Documents and Settings\reverse\Desktop\FASM• FASM’ı yola eklememizin sebebi FASM.exe’yi komut satırında hangi

dizinde olursak olalım çağırabilmek için.

Page 29: Windows 32 bit-asm

Introduction The Fasm

SDÜ-CYBERLAB Assembly

FASM’da Bulunan INCLUDE Klasörünü Yola Ekleme

Page 30: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

.text segment tanımlaması:

section ‘.bss’ readable writeable input_handle dd ?

.bss segment tanımlaması:

.data segment tanımlaması:

section ‘.text’ code readable executable

start: xor eax, eax

...

...

section ‘.data’ data readable writeable my_str db ‘’cyberlabsdu‘’,10,0

Page 31: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

.idata segment tanımlaması:

section ‘.idata’ import data readable library kernel32,’kernel32.dll’,\

msvcrt,’msvcrt.dll’ import kernel32,\

ExitProcess,’ExitProcess’,\WriteFile,’WriteFile’

Sonra cart cart cart

Page 32: Windows 32 bit-asm

Welcome To ExitWorld !

SDÜ-CYBERLAB Assembly

Assembly ile ilk basit programımız:format PE console

entry start

include ‘win32a.inc’section ‘.text’ code readable executablestart:

push 0call [Exit]

section ‘.idata’ import data readablelibrary kernel32,’kernel32.dll’import kernel32,\

Exit,’ExitProcess’• exit.asm şeklinde kaydedip console üzerinden « fasm exit.asm »

şeklinde derleyebilirsiniz.

Page 33: Windows 32 bit-asm

Lets Talk About Conditional Branching

SDÜ-CYBERLAB Assembly

Assembly kodumuz:format PE consoleentry start

include ‘win32a.inc’

section ‘.text’ code readable executablestart:

mov eax, 5my_loop:

dec eaxjnz my_loop

push 0call [Exit]

section ‘.idata’ import data readablelibrary kernel32,’kernel32.dll’import kernel32,\

Exit,’ExitProcess’

Page 34: Windows 32 bit-asm

Lets Play With Strings

SDÜ-CYBERLAB Assembly

mov eax, 1fhcldstosdstosdmov ax, 2255hstoswstosw

Page 35: Windows 32 bit-asm

Lets Play With Strings

SDÜ-CYBERLAB Assembly

String işlemlerini daha iyi anlayabilmek için aynı işlevi yapan farklı farklı kodlar yazıcaz.Challange1(Stosb):

format PE consoleentry start

include 'win32a.inc'

MAX_ARRAY_LENGTH = 20hsection '.data' data readable writeable

my_str db 'SDUCYBERLABWIN32ASM!',0bas db 'String uzunlugu: %d',10,0

section '.bss' readable writeabletarget_str db MAX_ARRAY_LENGTH dup(?)

section '.text' code readable executable

import kernel32,\Exit,'ExitProcess'

import msvcrt,\printf,'printf'

Page 36: Windows 32 bit-asm

Lets Play With Strings

SDÜ-CYBERLAB Assembly

start:mov esi, my_str ;esi’de stringmiz tutuluyormov edi, target_str ;edi’de stringimizi kopyalayacagımız destination adresimizxor bl, bl ;stringin sonu kontrol registerixor edx, edx ;sayacmy_loop:

mov al, byte[esi + edx] ;stringmizin o andaki indexindeki karakteri al registerina atıyoruz

inc edx ;sayacı artırstosb ;al registerindaki degeri edi registerina kopyalacmp bl, al ;string sonundamıyız ?jnz my_loop ;sonundaysak devam et degilsek my_loop geri don.

push edx ;format string'izin isaret ettigi sayipush bas ;.bss segmentimizdeki bas stringmizcall [printf]; Do itadd esp, 8 ;Islem sonrasi stack'e attigimiz verileri temizliyoruz.

Page 37: Windows 32 bit-asm

Lets Play With Strings

SDÜ-CYBERLAB Assembly

here_exit:push 0call [Exit]

section '.idata' import data readablelibrary kernel32,'kernel32.dll',\

msvcrt,'msvcrt.dll'

import kernel32,\Exit,'ExitProcess'

import msvcrt,\printf,'printf'

Page 38: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

String işlemlerini daha iyi anlayabilmek için aynı işlevi yapan farklı farklı kodlar yazıcaz.Challange2(lodsb):

format PE consoleentry start

include 'win32a.inc'

section '.data' data readable writeablemy_str db 'SDUCYBERLABWIN32ASM!',0bas db 'String uzunlugu: %d',10,0

Page 39: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

section '.text' code readable executablestart:

mov esi, my_str ;stringimizi esi registerina atiyoruz.xor bl, bl ;stringimizin sonuna gelinip gelinmedigini sorgulamak icin ebx registerinin

8 byte'lik low kismini kullaniyoruz. bl=0xor edx, edx ;edx registeri ile stringmizin uzunlugunu olcuyoruz.my_loop:

inc edx ;sayaci artirlodsb ;esi'de bulunan stringin indexindeki karakteri al registerina atadik.cmp bl, al ;0 mi kontrol ettikjnz my_loop ;Eger sifir degilse yaniyani string'in sonuna gelmemissek

my_loop'a don geldiysek yola devam;Ekrana_baspush edx ;format string'izin isaret ettigi sayipush bas ;.bss segmentimizdeki bas stringmizcall [printf] ; Do itadd esp, 8 ;Islem sonrasi stack'e attigimiz verileri temizliyoruz.;Cikishere_exit:

push 0call [Exit]

Page 40: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

section '.idata' import data readable

library kernel32,'kernel32.dll',\msvcrt,'msvcrt.dll'

import kernel32,\Exit,'ExitProcess'

import msvcrt,\printf,'printf'

Page 41: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

String işlemlerini daha iyi anlayabilmek için aynı işlevi yapan farklı farklı kodlar yazıcaz.Challange3(movsb):

format PE consoleentry start

include 'win32a.inc'

MAX_ARRAY_LENGTH = 20h

section '.data' data readable writeablemy_str db 'SDUCYBERLABWIN32ASM!',0bas db 'String uzunlugu: %d',10,0

section '.bss' readable writeabletarget_str db MAX_ARRAY_LENGTH dup(?)

section '.text' code readable executable

Page 42: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

start:mov esi, my_strmov edi, target_strxor al, alxor ecx, ecxmy_loop:

inc ecxcmp al, byte [esi]movsbjnz my_loop

push ecx ;format string'izin isaret ettigi sayipush bas ;.bss segmentimizdeki bas stringmizcall [printf] ; Do itadd esp, 8 ;Islem sonrasi stack'e attigimiz verileri temizliyoruz.

;Cikishere_exit:

push 0call [Exit]

Page 43: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

section '.idata' import data readable

library kernel32,'kernel32.dll',\msvcrt,'msvcrt.dll'

import kernel32,\Exit,'ExitProcess'

import msvcrt,\printf,'printf'

Page 44: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

String işlemlerini daha iyi anlayabilmek için aynı işlevi yapan farklı farklı kodlar yazıcaz.Challange4(repz):

format PE consoleentry start

include 'win32a.inc'

section '.data' data readable writeablemy_str db 'SDUCYBERLABWIN32ASM!',0yaz db 'String uzunlugu: %d',10,0

section '.text' code readable executable

Page 45: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

start:mov edi, my_str ;Destionation index'e datamızı koyuyoruz.mov ebx, edi ;String uzunlugunu net olarak almak icin edi'nin ilk adresini ebx

registerina atıyoruz.xor al, al ;eax'in 8 byte'lık low kısmını sıfırlıyoruz. stringimizin sonuna geldik

gelmedik mi karşılaştırmasını "al" ile yapıyoruz.repnz scasb ;repnz[repeat as long as not zero] scasb[scan string byte] :

yaniyani stringin sonuna gelene kadar tekrar et.;scasb komutu edi registerinin degerini her seferinde 1 artırır.String

dizisinin bir sonraki karakterini al registeri ile karsılastır.mov eax, edi ;yukarıdaki işlem tamamlandıgında edi registerinin son degeri

string'in son indexini gösteriyor olur.sub eax, ebx ;burada edi'de bulunan string'in ilk byte'indan son byte'ini

cıkarıyoruz. and we got it our string length.

Page 46: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

push eax ;format stringimize karsilik gelen deger yaniyani strigimizin uzunlugu ! push yaz ; .data sectiondaki "String uzu....." call [printf] ;ekrana bastıradd esp,4*2 ; işlem sonucunda fonksiyondan cikildiginda fonksiyona vermek

icin stack'e attıgımız degerler oldugu gibi yerinde durdugu icin onları temizliyoruz.

push 0 ; exit cikis koducall [ExitProcess] ; do it

Page 47: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

String işlemlerini daha iyi anlayabilmek için aynı işlevi yapan farklı farklı kodlar yazıcaz.Challange4(repz):

format PE consoleentry start

include 'win32a.inc'

section '.data' data readable writeablemy_str db 'SDUCYBERLABWIN32ASM!',0yaz db 'String uzunlugu: %d',10,0

section '.text' code readable executable

Page 48: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

start:mov edi, my_str ;Destionation index'e datamızı koyuyoruz.mov ebx, edi ;String uzunlugunu net olarak almak icin edi'nin ilk adresini ebx

registerina atıyoruz.xor al, al ;eax'in 8 byte'lık low kısmını sıfırlıyoruz. stringimizin sonuna geldik

gelmedik mi karşılaştırmasını "al" ile yapıyoruz.

repnz scasb ;repnz[repeat as long as not zero] scasb[scan string byte] : yaniyani stringin sonuna gelene kadar tekrar et.

;scasb komutu edi registerinin degerini her seferinde 1 artırır.String dizisinin bir sonraki karakterini al registeri ile karsılastır.

mov eax, edi ;yukarıdaki işlem tamamlandıgında edi registerinin son degeri string'in son indexini gösteriyor olur.

sub eax, ebx ;burada edi'de bulunan string'in ilk byte'indan son byte'ini cıkarıyoruz. and we got it our string length.

Page 49: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

push eax ;format stringimize karsilik gelen deger yaniyani strigimizin uzunlugu ! push yaz ; .data sectiondaki "String uzu....." call [printf] ;ekrana bastıradd esp,4*2 ; işlem sonucunda fonksiyondan cikildiginda fonksiyona vermek

icin stack'e attıgımız degerler oldugu gibi yerinde durdugu icin onları temizliyoruz.

push 0 ; exit cikis koducall [ExitProcess] ; do it

Page 50: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

section '.idata' import data readable

library kernel32,'kernel32.dll',\msvcrt,'msvcrt.dll'

import kernel32,\ExitProcess,'ExitProcess'

import msvcrt,\printf,'printf'

Page 51: Windows 32 bit-asm

Lets Talk About Sub Routine

SDÜ-CYBERLAB Assembly

Sub Routine nedir ?Sub Routine assembly kodumuz herhangi bir fonksiyonun mesela printf gibi herhangi bir fonksiyonun içerisine dallandığında fonksiyona hangi adreste girdiğini, fonksiyondan çıktıktan sonra nereden devam edeceğini işlemcinin bilmesi gerekiyor. İşlemcinin bunları yapabilmesi için kendi içerisinde bir kuralı vardır ve bunun adı subroutine olarak geçer. Daha yakından bakalım.

print_str: push ebp ;fonksiyona girdikten sonra ebp’yi kaydediyor.

mov esp, ebp ; stack’i fonksiyon için ayarlıyor

sub esp, 4*6 ;local değişkenler için stackten yer ayırıyoruz. Bu durumda pek gerekli olmasada.

push eax ;registerlar bizim için değerli ise esi,edi gibi registerlarda eklenebilir. Yada hepsini kaydetmek için pushad komutu kulllanılabilir.push ebxpush ecxpush edx

push esi ;string veriliyor. call [printf] ;ekrana yazdırılıyor. add esp,4 ;stack’te en son pushlanan esi registerini temizliyoruz.

pop edx ;registarlari eski haline getiriyoruz.pop ecxpop ebxpop eax

add esp, 4*6 ;local degiskenler için ayrılan alan geri veriliyor.mov ebp, esp ;stack pointer fonksiyona girildiğindeki değerine geri dönderilyor.pop ebp ;eski ebp fonksiyona girildiğindeki degerine donderiliyor.

ret ;ve fonksiyona girdiği adresten bir sonraki adrese yaniyani eip’nin işaret ettiği adrese donderiliyor.

Page 52: Windows 32 bit-asm

Introduction Immunity Debugger

SDÜ-CYBERLAB Assembly

Page 53: Windows 32 bit-asm

Introduction Immunity Debugger

SDÜ-CYBERLAB Assembly

Page 54: Windows 32 bit-asm

Introduction Immunity Debugger

SDÜ-CYBERLAB Assembly

Bazı kısayollar:F7: Step inF8: Step overF9: ContinueF2: Break Point SoftCTRL+G:Search

Daha fazlası için ImmLib -> Lib References

Page 55: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

WinDBG

Page 56: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

bp(break point) $exentry(programın başlangıç adresi)

Page 57: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

g(continue/go)

Page 58: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

t(step in)

Page 59: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

Page 60: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

Memory

Page 61: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

Page 62: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

r(show)/dd(data dword): 00401000 adresindeki verileri dword halinde göster !

Page 63: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

lm(list modules)

Page 64: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

u(stands for unassemble)

Page 65: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

a(stands for assemble): istedigimiz register’a yada adrese istedigimiz girdiyi vermemize sağlar.

Page 66: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

Page 67: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

Page 68: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

?: r komutuna benzerdir daha gelişmişidir. Genelde pointerlar’da kullanırız.

Page 69: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

poi(stands for pointer): Adresin işaret ettiği değeri elde etmemizi sağlar.

Page 70: Windows 32 bit-asm

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

s(search): Bellekte aradığımız adres içerisinde string,sayi ne istersek 2.arguman olarak vererek arama yapmamızı sağlar.

Page 71: Windows 32 bit-asm

Windows API Introduction

SDÜ-CYBERLAB Assembly

Yazılan programlar doğrudan işletim sistemine erişemez.

İşletim sistemi geliştiricileri programcıların işletim sistemi üzerinde kod geliştirmesi içinAPI dediğimiz özel fonksiyonlar geliştirmişlerdir.

API(Application Programming Interface)

Windows API’ler windows işletim sistemi üzerinde ‘.dll’(Dynamic Linked Library) dosyalarda tutulur.

Page 72: Windows 32 bit-asm

Dynamic Linked Library

SDÜ-CYBERLAB Assembly

DLL’ler çalıştırabilir bir dosyadır. Entry Point dediğimiz programımızın işletim sistemi tarafından çalıştırılmaya başladığı başlangıç adresi dll dosyalarında bulunmamaktadır.

Herhangi bir çalıştırılabilir dosya dll dosyalarını kullanabilir.

DLL’ler fiziksel hafızaya sadece 1 kere yüklenirler ve birçok program tarafından defalarca kullanılabilirler.

Her DLL işletim sistemine ait olmayabilir. Kendi dll dosyamızı istersek yazabiliriz.

Page 73: Windows 32 bit-asm

Some DLL’s

SDÜ-CYBERLAB Assembly

Kernel32.dllDosya Sistemi, Hafıza Yönetimi, Processler, Threadler, Error Handler

User32.dllWindows GUI

Gdi32.dllGrafik: Monitor çıktısı, yazıcılar vs vs

Msvcrt.dllString işlemleri ve daha bir çoğu.

Bir çok dll mevcut daha fazlası için msdn.com

Page 74: Windows 32 bit-asm

API Samples

SDÜ-CYBERLAB Assembly

format PE consoleentry start

include 'win32a.inc'

section '.text' code readable executable

start:

push 0 ;Exit cikis koducall [Exit] ;Exit fonksiyonunu cagiriyoruz.

section '.idata' import data readable

library kernel32,'kernel32.dll' ;kernel32.dll dll'ini kernel32 adiyla tanimliyoruz.

import kernel32,\Exit,'ExitProcess' ;kernel32.dll dosyasindan ExitProcess

fonksiyonunu

;"Exit" programa import ediyoruz.

Page 75: Windows 32 bit-asm

API Samples

SDÜ-CYBERLAB Assembly

format PE consoleentry start

include 'win32a.inc'

section '.text' code readable executable

start:

push 0 ;Exit cikis koducall [Exit] ;Exit fonksiyonunu cagiriyoruz.

section '.idata' import data readable

library kernel32,'kernel32.dll' ;kernel32.dll dll'ini kernel32 adiyla tanimliyoruz.

import kernel32,\Exit,'ExitProcess' ;kernel32.dll dosyasindan ExitProcess

fonksiyonunu

;"Exit" programa import ediyoruz.

Page 76: Windows 32 bit-asm

API Samples

SDÜ-CYBERLAB Assembly

format PE consoleentry start

include 'win32a.inc'

section '.text' code readable executable

start:

push 0 ;Exit cikis koducall [Exit] ;Exit fonksiyonunu cagiriyoruz.

section '.idata' import data readable

library kernel32,'kernel32.dll' ;kernel32.dll dll'ini kernel32 adiyla tanimliyoruz.

import kernel32,\Exit,'ExitProcess' ;kernel32.dll dosyasindan ExitProcess

fonksiyonunu

;"Exit" programa import ediyoruz.

Page 77: Windows 32 bit-asm

API Samples

SDÜ-CYBERLAB Assembly

format PE consoleentry start

include 'win32a.inc'

section '.text' code readable executable

start:

push 0 ;Exit cikis koducall [Exit] ;Exit fonksiyonunu cagiriyoruz.

section '.idata' import data readable

library kernel32,'kernel32.dll' ;kernel32.dll dll'ini kernel32 adiyla tanimliyoruz.

import kernel32,\Exit,'ExitProcess' ;kernel32.dll dosyasindan ExitProcess fonksiyonunu

;"Exit" programa import ediyoruz.

Page 78: Windows 32 bit-asm

API Samples

SDÜ-CYBERLAB Assembly

Page 79: Windows 32 bit-asm

API Samples

SDÜ-CYBERLAB Assembly

Page 80: Windows 32 bit-asm

API Samples

SDÜ-CYBERLAB Assembly

Page 81: Windows 32 bit-asm

API Samples

SDÜ-CYBERLAB Assembly

; Complex macro example

include 'win32ax.inc' ; complex macro include file is here

.code

start:invoke MessageBox,HWND_DESKTOP,"Hi! I'm the example

program!",invoke GetCommandLine,MB_OKinvoke ExitProcess,0

.end start

Page 82: Windows 32 bit-asm

Thanks

SDÜ-CYBERLAB Assembly

İletişim: Mail: [email protected]: https://www.linkedin.com/in/ismail-bozkurtr-019059b1Github: https://github.com/ismailbozkurt

Teşekkürler

Page 83: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

Page 84: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly

Page 85: Windows 32 bit-asm

Introduction The FASM

SDÜ-CYBERLAB Assembly