Temel Assembly Dersi

Çokgen

Katılımcı Üye
4 Eyl 2023
412
194
Merhaba arkadaşlar, bugün sizlere temel assembly öğreticeğim. Öğrenirken tutmmuş olduğum notları göstericeğim. Herhangi bir mühendislik eğitimi almadığımı belirtiyim. İnternetten öğrendiğim kadarıyla sizlerede yardımcı olmayı umud edeiyorum.
Umarım işinize yarar.

Memory Segmentation

İşletim sistemi üzerinde çalıştırılacak olan her proses, çalışma sırasında hafıza üzerinde kendine ait bir alana ihtiyaç duymaktadır. Proses için ayrılan bu hafıza alanı ise işletim sistemi tarafında farklı amaçlar için kullanılmak üzere bölümlere ayrılmıştır. Bu bölümler den kısaca bahsedelim

.text Segment

Bu hafıza alanı çalıştırılan binary dosyanın kodlarının saklandığı hafıza lanıdır. Bu alanda uygulamaya ait makina kodları şeklinde bulunmaktadır. Uygulama çalıştırıldığında işlemci program counter vasıtası ile bu alandaki kodaları işleyerek uygulamanın çalışmasını gerçekleştirir.

.data Segment

Bu alanda yazdığınız program içerisinde global olarak tanımlanmış ve ilk değer atanmış değişkenler bulunmaktadır.

.bss Segment

Bu alanda da aynen .data segment alanında olduğu gibi global olarak tanımlanmış değişkenler tutulur. Ancak bu değişkenler kodlama sırasında ilk değer almamışlardır.

Heap Segment

Heap alanı programın çalışması sırasında dinamik olarak kullanılan bir alandır. Bu alanın kullanımı programcı tarafından kontrol edilmektedir. Programı bu kontrol ederken malloc(), new() gibi allocator fonksiyonlarını kullanmalıdır.

ch4kGs.jpg


Stack Segment

Bu alan uygulama çalıştırılırken kullanılan özel bir alandır. Çalıştırılan fonksiyonların geçici değerleri bu alanda barındırılmaktadır. Bir fonksiyon sistemde oluşturulduğu zaman stack üzerinde de o fonksiyon ile ilgili bir alan oluşturulur. Fonksiyonun çalışması tamamlandıktan sonra ise o fonksiyona ait hafıza alanı kullanılmaz ve stack ona göre tekrar düzenlenir. Bu alan programcı tarafından yönetilmesine gerek duyulmayan bir alandır. Diğer hafıza alanlarından farklı olarak stack yüksek adres alanından düşük adres alanına doğru büyüme gösterir.


System Call, Syscall için çağrılan kodlar

Eax, Ebx, Ecx kodlarıdır. Normal olarak kullanılabilir fakat genel olarak sitem çağrıları bu kodlar üzerinden gerçekleşir
.1. EAX – Extended Accumulator Register: İşlemci tarafından matematiksel işlemler için öncelikli olarak kullanılan registerdır.

Genellikle bu register fonksiyonların geri dönüş değerlerini bir üst fonksiyonuna taşımak için kullanılır.
2. EDX – Extended Data Register: Genellikle büyük hesaplamalar yapılırken gereken extra alan için kullanılır. EAX registeri çarpma gibi bir matematiksel işlemde gerekli olan extra yeri EDX registerinden temin eder. Ayrıca bu register giriş/çıkış işlemler sırasında gösterici olarak da kullanılır.
3. ECX – Extended Count Register: ECX registeri döngüsel işlemlerinde sıklıkla kullanılmaktadır.
4. EBX – Extended Base Pointer: Bu register data segment içinde bir alanı östermek veya hesaplamalarda extra alan olarak kullanılmaktadır.
5. ESI – Extended Source Index: ESI Registeri, genellikle string yada döngü işlemleri sırasında okuma yapılacak yerin adresini gösterir.
6. EDI – Extended Destination Index: EDI Registeri, genellikle string yada döngü işlemleri sırasında yazma yapılacak yerin adresini gösterir.
7. ESP – Extended Stack Printer: ESP Registerinin kullanma amacı stack alanının en üst noktasının bilgisini tutar.

8. EBP – Extended Base Pointer: EBP Registeri stack yapısı içinde kullanılan yerel değişlenlere erişmek için referans olarak kullanılır.

Db aslında aktar ve değer ver gibi anlama gelir.
Section .data blümünde kullanılır çünkü dosya her zaman çağrılabilir. db bir byte verisi tanımlamak için kullanılır ve genellikle .data bölümünde kullanılır çünkü burası programın veri bölümüdür ve veri tanımları burada yeralır.Stdout: Stdout aslında oldukça basit bir mantıktadır.
Stdout’a 1 değerini verirsek çıkış yani Printf fonksiyonu gibi olur ekrana yazı yazdırmak için bir adım. Yani sistemden Write çağrısı yapıldıktan sonra işlemin çıkış mı giriş mi olduğu anlaşılmak amaçlı bir kod kalıbıdır.Peki 0x0a nedir?0X0a bir hexacademiallık bir koddur.
0x0a aslında Python ve C dillerinde bildiğimiz gibi yeni satıra atla anlamına gelir.; nedir asm’de?; yorum satırıdır.
Bundan sonra yazılıcaklar not gibi tutulabilir.

Kod gibi çalışmaz.Peki , nedir. Belirtme amaçlı kullanılır. Yani mov eax 1 dersek eaxa ne atıyacağını anlayamaz sistem.Geldik Assemblyde en çok kullanıcağımız kodlardan birine:Mov nedir?Mov değer atama işlemleri amaçlı bir koddur.

Yani Mov eax, 5 dersek eax 5 olur bu kod şu kod ile tamamen aynı gibidir: eax = 1


İnt 0x80 nedir?

Registerları kontrol eder ve sistem çağrısı yapar kod ile uygunsa.
0x80 yazmak yerine sysenter da yazılabilir. 64 bit de syscall da yazılabilir.İnt 0x80 aslında bir sistem çağrısıdır.
Yani aslında şu kod ile şu kod aynı değildir:Örnek 1:mov eax,4mov ebx, 2Add eax, ebx ; add İngilizceden de bildiğimiz toplama anlamına gelir add ile örnekler yapıcağım.
Bu kodun sonucu 6dır ama bu kod ile farklıdır.Mov eax, 6Mov ebx, 1İnt 0x80Bu kodda wrtie fonksiyonunu çağırır ve stdoutdan çıkış işlemi yapıcağını söyler.
Bu kodda add eklemek pekde mantıklı olmaz. O koddan add’i çıkkartığımızı düşünelim sadece eaxa 4 ve ebxe 1 değerini atar yani sistem çağırısı yapmaz.

Yani şuana kadar anlattığım kadarıyla bir kod:

Kod:
Section .data
Mesaj db “Merhaba Dünya”,
 0x0a Section .text ; wrtie() kodu
Mov eax, 4 ; yorum satırı açık. Write fonksiyonunu çağırdık
Mov ebx, 1 ; Stdout fonksiyonundan çıkış yani ekrana yazdırmayı seçtik.
 Mov ecx , Mesaj ; Ecx registerına mesaj stringini(metnini) atadık.
Mov edx, 13 ; Burda mesaj yani “Merhaba,Dünya” metnin len yani satır sayısını istiyor veya boyut denewbilir.
 İnt 0x80 ; Çelirdeğe(işlemciye) sistem çağrımızı yaptık . ; exit(0) sistem çağrısı

Mov eax, 1; çıkış sistem çarğısı
Mov ebx, 0 ;programın başarıyla sonlandığını sisteme bildirdik ve kodu sonlandırıcak.
 İnt 0x80 ; sistem çağrısı yapıldı kod ekrana yazıldı ve çıkıldı.


Pop: Push’lanmış veriyi çıkarır ve eski değerine geri atar
Push: Push kodu depolama kodu gibi düşünün. Push kayıt edilen veriyi stack(yığın bölümüne kaydeder) yani dosya kaydedilmiş olur. Örnek olarak şöyle diyelim:

Kod:
Mov eax, 1
Push eax ; eax depolanır(stack bölgesinde kayıt edilir)
Mov eax, 2 ; eax’a 2 değerini verdik poplayana kadar
Mov ecx, 3
Add eax, ecx

Pop eax ; eax eski numarasında yani 1 oldu pop komutu kaydedileni stack bölümünden çıkardı ve eax’ı eski değerine atadı.
Pop: Pushın tersie kaydedilmiş bir dosya yani push ile kaydedilen bir registerı alır ve siler.
Eski eax değeri geri getirilir. Verdiğim örnekteki eax değeri 1 e döner.
Call: Call komutu pythondaki def gibidir farkı kodu devam ettirebilir. Yani, bir kod parçası çağırıldıktan sonra call ile kod devamı yapılabilir. CALL assembly komutu ile program akışı uygulamanın kod alanı içinde başka bir yerde bulunan bir fonksiyon alanına gider ve fonsiyonun işlemi tamamlandıktan sonra ana program akışı içinde kaldığı yerden devam eder. CALL ile çağırılan fonksiyonun işlemleri tamamlandıktan sonra ana kod akışında kaldığı yerden devam etmesi için çağırılan fonksiyonda RET assembly komutunun çalıştırılması gerekmektedir.
Ret komutununn çağrılıcak fonksiyonun altında olması şarttır.sub: Verilen kaynak değer, hedef değişkenindan çıkarılır. Örneğin: sub ax, bx komutu AX değişkenindan BX değişkeninin değerini çıkarır.mul: Verilen kaynak değer, hedef değişkeniyle çarpılır. Örneğin: mul ax, bx komutu AX değişkenini BX değişkeniyle çarpar.


Assembly öğrenirken her bir işlemcinin assembly kullanımının farklı olduğunu unutmayalım.



Aldığım notlarda bana yardımcı olan kaynaklar:



THT'de size yardımcı olabilicek kaynaklar:


Yakında assembly kodlarını çalışor bir şekilde fudlayarak shellcode yapma kodunu yazıcağım ama öğreterek. Sonrasında exploitler yazıcağız.
 
Son düzenleme:

ACE Veen

Uzman üye
4 Şub 2023
1,105
559
Belirsiz
Merhaba arkadaşlar, bugün sizlere temel assembly öğreticeğim. Öğrenirken tutmmuş olduğum notları göstericeğim. Herhangi bir mühendislik eğitimi almadığımı belirtiyim. İnternetten öğrendiğim kadarıyla sizlerede yardımcı olmayı umud edeiyorum.
Umarım işinize yarar.

System Call, Syscall için çağrılan kodlar
Eax, Ebx, Ecx kodlarıdır. Normal olarak kullanılabilir fakat genel olarak sitem çağrıları bu kodlar üzerinden gerçekleşir
.1. EAX – Extended Accumulator Register: İşlemci tarafından matematiksel işlemler için öncelikli olarak kullanılan registerdır.

Genellikle bu register fonksiyonların geri dönüş değerlerini bir üst fonksiyonuna taşımak için kullanılır.
2. EDX – Extended Data Register: Genellikle büyük hesaplamalar yapılırken gereken extra alan için kullanılır. EAX registeri çarpma gibi bir matematiksel işlemde gerekli olan extra yeri EDX registerinden temin eder. Ayrıca bu register giriş/çıkış işlemler sırasında gösterici olarak da kullanılır.
3. ECX – Extended Count Register: ECX registeri döngüsel işlemlerinde sıklıkla kullanılmaktadır.
4. EBX – Extended Base Pointer: Bu register data segment içinde bir alanı östermek veya hesaplamalarda extra alan olarak kullanılmaktadır.
5. ESI – Extended Source Index: ESI Registeri, genellikle string yada döngü işlemleri sırasında okuma yapılacak yerin adresini gösterir.
6. EDI – Extended Destination Index: EDI Registeri, genellikle string yada döngü işlemleri sırasında yazma yapılacak yerin adresini gösterir.
7. ESP – Extended Stack Printer: ESP Registerinin kullanma amacı stack alanının en üst noktasının bilgisini tutar.

8. EBP – Extended Base Pointer: EBP Registeri stack yapısı içinde kullanılan yerel değişlenlere erişmek için referans olarak kullanılır.

Db aslında aktar ve değer ver gibi anlama gelir.
Section .data blümünde kullanılır çünkü dosya her zaman çağrılabilir. db bir byte verisi tanımlamak için kullanılır ve genellikle .data bölümünde kullanılır çünkü burası programın veri bölümüdür ve veri tanımları burada yeralır.Stdout: Stdout aslında oldukça basit bir mantıktadır.
Stdout’a 1 değerini verirsek çıkış yani Printf fonksiyonu gibi olur ekrana yazı yazdırmak için bir adım. Yani sistemden Write çağrısı yapıldıktan sonra işlemin çıkış mı giriş mi olduğu anlaşılmak amaçlı bir kod kalıbıdır.Peki 0x0a nedir?0X0a bir hexacademiallık bir koddur.
0x0a aslında Python ve C dillerinde bildiğimiz gibi yeni satıra atla anlamına gelir.; nedir asm’de?; yorum satırıdır.
Bundan sonra yazılıcaklar not gibi tutulabilir.

Kod gibi çalışmaz.Peki , nedir. Belirtme amaçlı kullanılır. Yani mov eax 1 dersek eaxa ne atıyacağını anlayamaz sistem.Geldik Assemblyde en çok kullanıcağımız kodlardan birine:Mov nedir?Mov değer atama işlemleri amaçlı bir koddur.

Yani Mov eax, 5 dersek eax 5 olur bu kod şu kod ile tamamen aynı gibidir: eax = 1


İnt 0x80 nedir?

Registerları kontrol eder ve sistem çağrısı yapar kod ile uygunsa.
0x80 yazmak yerine sysenter da yazılabilir. 64 bit de syscall da yazılabilir.İnt 0x80 aslında bir sistem çağrısıdır.
Yani aslında şu kod ile şu kod aynı değildir:Örnek 1:mov eax,4mov ebx, 2Add eax, ebx ; add İngilizceden de bildiğimiz toplama anlamına gelir add ile örnekler yapıcağım.
Bu kodun sonucu 6dır ama bu kod ile farklıdır.Mov eax, 6Mov ebx, 1İnt 0x80Bu kodda wrtie fonksiyonunu çağırır ve stdoutdan çıkış işlemi yapıcağını söyler.
Bu kodda add eklemek pekde mantıklı olmaz. O koddan add’i çıkkartığımızı düşünelim sadece eaxa 4 ve ebxe 1 değerini atar yani sistem çağırısı yapmaz.

Yani şuana kadar anlattığım kadarıyla bir kod:

Kod:
Section .data
Mesaj db “Merhaba Dünya”,
 0x0a Section .text ; wrtie() kodu
Mov eax, 4 ; yorum satırı açık. Write fonksiyonunu çağırdık
Mov ebx, 1 ; Stdout fonksiyonundan çıkış yani ekrana yazdırmayı seçtik.
 Mov ecx , Mesaj ; Ecx registerına mesaj stringini(metnini) atadık.
Mov edx, 13 ; Burda mesaj yani “Merhaba,Dünya” metnin len yani satır sayısını istiyor veya boyut denewbilir.
 İnt 0x80 ; Çelirdeğe(işlemciye) sistem çağrımızı yaptık . ; exit(0) sistem çağrısı

Mov eax, 1; çıkış sistem çarğısı
Mov ebx, 0 ;programın başarıyla sonlandığını sisteme bildirdik ve kodu sonlandırıcak.
 İnt 0x80 ; sistem çağrısı yapıldı kod ekrana yazıldı ve çıkıldı.


Pop: Push’lanmış veriyi çıkarır ve eski değerine geri atar
Push: Push kodu depolama kodu gibi düşünün. Push kayıt edilen veriyi stack(yığın bölümüne kaydeder) yani dosya kaydedilmiş olur. Örnek olarak şöyle diyelim:

Kod:
Mov eax, 1
Push eax ; eax depolanır(stack bölgesinde kayıt edilir)
Mov eax, 2 ; eax’a 2 değerini verdik poplayana kadar
Mov ecx, 3
Add eax, ecx

Pop eax ; eax eski numarasında yani 1 oldu pop komutu kaydedileni stack bölümünden çıkardı ve eax’ı eski değerine atadı.
Pop: Pushın tersie kaydedilmiş bir dosya yani push ile kaydedilen bir registerı alır ve siler.
Eski eax değeri geri getirilir. Verdiğim örnekteki eax değeri 1 e döner.
Call: Call komutu pythondaki def gibidir farkı kodu devam ettirebilir. Yani, bir kod parçası çağırıldıktan sonra call ile kod devamı yapılabilir. CALL assembly komutu ile program akışı uygulamanın kod alanı içinde başka bir yerde bulunan bir fonksiyon alanına gider ve fonsiyonun işlemi tamamlandıktan sonra ana program akışı içinde kaldığı yerden devam eder. CALL ile çağırılan fonksiyonun işlemleri tamamlandıktan sonra ana kod akışında kaldığı yerden devam etmesi için çağırılan fonksiyonda RET assembly komutunun çalıştırılması gerekmektedir.
Ret komutununn çağrılıcak fonksiyonun altında olması şarttır.sub: Verilen kaynak değer, hedef değişkenindan çıkarılır. Örneğin: sub ax, bx komutu AX değişkenindan BX değişkeninin değerini çıkarır.mul: Verilen kaynak değer, hedef değişkeniyle çarpılır. Örneğin: mul ax, bx komutu AX değişkenini BX değişkeniyle çarpar.


Assembly öğrenirken her bir işlemcinin assembly kullanımının farklı olduğunu unutmayalım.



Aldığım notlarda bana yardımcı olan kaynaklar:




Yakında assembly kodlarını çalışor bir şekilde fudlayarak shellcode yapma kodunu yazıcağım ama öğreterek. Sonrasında exploitler yazıcağız.
eline sağlık
 
Ü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.