Windows 32 bit-asm

Preview:

Citation preview

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

Windows 32-Bit Assembly

İsmail BOZKURT

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

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.

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.

Logic Operations

SDÜ-CYBERLAB Assembly

XOR Kapısı

Logic Operations

SDÜ-CYBERLAB Assembly

OR Kapısı

Logic Operations

SDÜ-CYBERLAB Assembly

AND Kapısı

Logic Operations

SDÜ-CYBERLAB Assembly

NOT Kapısı

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.

X86 Memory Segments

SDÜ-CYBERLAB Assembly

0xFFFFFFFF

0x00000000

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 ?

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.

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

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.

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.

Registers

SDÜ-CYBERLAB Assembly

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

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.

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.

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.

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.

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.

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)

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

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 ?

Introduction The Fasm

SDÜ-CYBERLAB Assembly

FASM Yola Ekleme

Introduction The Fasm

SDÜ-CYBERLAB Assembly

FASM Yola Ekleme

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.

Introduction The Fasm

SDÜ-CYBERLAB Assembly

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

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

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

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.

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’

Lets Play With Strings

SDÜ-CYBERLAB Assembly

mov eax, 1fhcldstosdstosdmov ax, 2255hstoswstosw

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'

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.

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'

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

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]

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'

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

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]

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'

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

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.

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

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

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.

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

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'

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.

Introduction Immunity Debugger

SDÜ-CYBERLAB Assembly

Introduction Immunity Debugger

SDÜ-CYBERLAB Assembly

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

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

WinDBG

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

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

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

g(continue/go)

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

t(step in)

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

Memory

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

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

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

lm(list modules)

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

u(stands for unassemble)

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

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

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

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

Introduction The WinDBG

SDÜ-CYBERLAB Assembly

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

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.

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.

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.

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

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.

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.

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.

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.

API Samples

SDÜ-CYBERLAB Assembly

API Samples

SDÜ-CYBERLAB Assembly

API Samples

SDÜ-CYBERLAB Assembly

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

Thanks

SDÜ-CYBERLAB Assembly

İletişim: Mail: BozkurTR000@gmail.comLinkedin: https://www.linkedin.com/in/ismail-bozkurtr-019059b1Github: https://github.com/ismailbozkurt

Teşekkürler

Introduction The FASM

SDÜ-CYBERLAB Assembly

Introduction The FASM

SDÜ-CYBERLAB Assembly

Introduction The FASM

SDÜ-CYBERLAB Assembly

Recommended