x86 Mimarisi ve Tersine Mühendislik

127
Pwn101 x86 Mimarisi ve Tersine Mühendislik

Transcript of x86 Mimarisi ve Tersine Mühendislik

Page 1: x86 Mimarisi ve Tersine Mühendislik

Pwn101x86 Mimarisi ve Tersine Mühendislik

Page 2: x86 Mimarisi ve Tersine Mühendislik

İçerik

● Tersine mi mühendislik?● Ufak adam kompüteri● Ucundan azcık..● Masaüstünde durduğu gibi durmaz!● Aşağı tükürsen Heap, yukarı tükürsen Stack● Tam gaz..● One ring to rule 'em all (syscalls)● Sudan karaya geçiş● Anti-debugging teknikleri ve atlatma● Araç çantası

www.robindimyanoglu.com Canyoupwn.me

Page 3: x86 Mimarisi ve Tersine Mühendislik

1. Bölüm: Köprüden Önce Son Çıkış

www.robindimyanoglu.com Canyoupwn.me

Page 4: x86 Mimarisi ve Tersine Mühendislik

Köprüden Önce Son Çıkış

Tersine mi Mühendislik?

“Tersine mühendislik bir sistemin daha yüksek bir soyutlama seviyesinde temsilini yaratmak için analiz edilmesi işlemidir.”

www.robindimyanoglu.com Canyoupwn.me

Page 5: x86 Mimarisi ve Tersine Mühendislik

Köprüden Önce Son Çıkış

www.robindimyanoglu.com Canyoupwn.me

Page 6: x86 Mimarisi ve Tersine Mühendislik

Köprüden Önce Son Çıkış

Ne İşe Yarar?➔ Kapalı kaynak kodlu programın kaynak kodlarını

ortaya çıkartmak

www.robindimyanoglu.com Canyoupwn.me

Page 7: x86 Mimarisi ve Tersine Mühendislik

Köprüden Önce Son Çıkış

Ne İşe Yarar?➔ Kapalı kaynak kodlu programın kaynak kodlarını

ortaya çıkartmak➔ Yazılımlarda zafiyet aramak

www.robindimyanoglu.com Canyoupwn.me

Page 8: x86 Mimarisi ve Tersine Mühendislik

Köprüden Önce Son Çıkış

Ne İşe Yarar?➔ Kapalı kaynak kodlu programın kaynak kodlarını

ortaya çıkartmak➔ Yazılımlarda zafiyet aramak➔ Zararlı yazılım analizi

www.robindimyanoglu.com Canyoupwn.me

Page 9: x86 Mimarisi ve Tersine Mühendislik

Köprüden Önce Son Çıkış

Ne İşe Yarar?➔ Kapalı kaynak kodlu programın kaynak kodlarını

ortaya çıkartmak➔ Yazılımlarda zafiyet aramak➔ Zararlı yazılım analizi➔ Lisans korumalarını atlatmak (cracking)

www.robindimyanoglu.com Canyoupwn.me

Page 10: x86 Mimarisi ve Tersine Mühendislik

Köprüden Önce Son Çıkış

Ne İşe Yarar?➔ Kapalı kaynak kodlu programın kaynak kodlarını

ortaya çıkartmak➔ Yazılımlarda zafiyet aramak➔ Zararlı yazılım analizi➔ Lisans korumalarını atlatmak (cracking)➔ Yazılımlara ek özellikler getirmek (patching)

www.robindimyanoglu.com Canyoupwn.me

Page 11: x86 Mimarisi ve Tersine Mühendislik

Köprüden Önce Son Çıkış

Ne İşe Yarar?➔ Kapalı kaynak kodlu programın kaynak kodlarını

ortaya çıkartmak➔ Yazılımlarda zafiyet aramak➔ Zararlı yazılım analizi➔ Lisans korumalarını atlatmak (cracking)➔ Yazılımlara ek özellikler getirmek (patching)➔ Oyun hileleri!!! :D

www.robindimyanoglu.com Canyoupwn.me

Page 12: x86 Mimarisi ve Tersine Mühendislik

2. Bölüm: Ufak Adam Kompüteri

www.robindimyanoglu.com Canyoupwn.me

Page 13: x86 Mimarisi ve Tersine Mühendislik

Ufak Adam Kompüteri

Little Man Computer, 1965 yılında Dr. Stuart Madnick tarafından tasarlanmış, von Neumann mimarisine dayanan farazi bir bilgisayar modelidir. Günümüz bilgisayarlarının bütün özelliklerine sahip bu model, öğrencilere bilgisayarların çalışma mantığını kavratmak amacıyla okullarda öğretilmektedir. Kendine ait komut seti ve bir dili vardır.

www.robindimyanoglu.com Canyoupwn.me

Page 14: x86 Mimarisi ve Tersine Mühendislik

Ufak Adam Kompüteri

www.robindimyanoglu.com Canyoupwn.me

Page 15: x86 Mimarisi ve Tersine Mühendislik

Bilgisayarın Öğeleri

➔ Program sayacı: Çalıştırılacak bir sonraki talimatın kaç numaralı posta kutusunda olduğunu gösterir. Günümüz bilgisayarındaki karşılığı Instruction Pointer dır.

www.robindimyanoglu.com Canyoupwn.me

Page 16: x86 Mimarisi ve Tersine Mühendislik

Bilgisayarın Öğeleri

➔ Program sayacı: Çalıştırılacak bir sonraki talimatın kaç numaralı posta kutusunda olduğunu gösterir. Günümüz bilgisayarındaki karşılığı Instruction Pointer dır.

➔ Posta kutuları: Her birinin kendine ait bir numarası (adresi) vardır ve içlerinde veri barındırırlar. Bu veri yerine göre talimatta olabilir, normal veri de olabilir. Bilgisayardaki karşılığı RAM dir.

www.robindimyanoglu.com Canyoupwn.me

Page 17: x86 Mimarisi ve Tersine Mühendislik

Bilgisayarın Öğeleri

➔ Program sayacı: Çalıştırılacak bir sonraki talimatın kaç numaralı posta kutusunda olduğunu gösterir. Günümüz bilgisayarındaki karşılığı Instruction Pointer dır.

➔ Posta kutuları: Her birinin kendine ait bir numarası (adresi) vardır ve içlerinde veri barındırırlar. Bu veri yerine göre talimatta olabilir, normal veri de olabilir. Bilgisayardaki karşılığı RAM dir.

➔ Sepetler: Girdi ve çıktı verilerini taşırlar.

www.robindimyanoglu.com Canyoupwn.me

Page 18: x86 Mimarisi ve Tersine Mühendislik

Bilgisayarın Öğeleri

➔ Program sayacı: Çalıştırılacak bir sonraki talimatın kaç numaralı posta kutusunda olduğunu gösterir. Günümüz bilgisayarındaki karşılığı Instruction Pointer dır.

➔ Posta kutuları: Her birinin kendine ait bir numarası (adresi) vardır ve içlerinde veri barındırırlar. Bu veri yerine göre talimatta olabilir, normal veri de olabilir. Bilgisayardaki karşılığı RAM dir.

➔ Sepetler: Girdi ve çıktı verilerini taşırlar.➔ Hesap makinesi: Girdi verilerini geçici olarak tutarlar.

Ayrıca aritmetik işlemlerde kullanılırlar. Bilgisayardaki karşılığı Accumulator Register dır.

www.robindimyanoglu.com Canyoupwn.me

Page 19: x86 Mimarisi ve Tersine Mühendislik

Çalıştırma Döngüsü

➔ Ufak adam öncelikle çalıştıracağı talimatı (instruction) barındıran posta kutusunun numarasını öğrenmek için program sayacına bakar.

www.robindimyanoglu.com Canyoupwn.me

Page 20: x86 Mimarisi ve Tersine Mühendislik

Çalıştırma Döngüsü

➔ Ufak adam öncelikle çalıştıracağı talimatı (instruction) barındıran posta kutusunun numarasını öğrenmek için program sayacına bakar.

➔ Sayaçta gördüğü numaradaki posta kutusundan zarfı alır ve üstündeki rakamları okur.

www.robindimyanoglu.com Canyoupwn.me

Page 21: x86 Mimarisi ve Tersine Mühendislik

Çalıştırma Döngüsü

➔ Ufak adam öncelikle çalıştıracağı talimatı (instruction) barındıran posta kutusunun numarasını öğrenmek için program sayacına bakar.

➔ Sayaçta gördüğü numaradaki posta kutusundan zarfı alır ve üstündeki rakamları okur.

➔ Sayacın değeri 1 arttırır.

www.robindimyanoglu.com Canyoupwn.me

Page 22: x86 Mimarisi ve Tersine Mühendislik

Çalıştırma Döngüsü

➔ Ufak adam öncelikle çalıştıracağı talimatı (instruction) barındıran posta kutusunun numarasını öğrenmek için program sayacına bakar.

➔ Sayaçta gördüğü numaradaki posta kutusundan zarfı alır ve üstündeki rakamları okur.

➔ Sayacın değeri 1 arttırır.➔ Okuduğu rakamlardan hangi talimatı gerçekleştireceğini

anlar.

www.robindimyanoglu.com Canyoupwn.me

Page 23: x86 Mimarisi ve Tersine Mühendislik

Çalıştırma Döngüsü

➔ Ufak adam öncelikle çalıştıracağı talimatı (instruction) barındıran posta kutusunun numarasını öğrenmek için program sayacına bakar.

➔ Sayaçta gördüğü numaradaki posta kutusundan zarfı alır ve üstündeki rakamları okur.

➔ Sayacın değeri 1 arttırır.➔ Okuduğu rakamlardan hangi talimatı gerçekleştireceğini

anlar.➔ Talimatı gerçekleştirir.

www.robindimyanoglu.com Canyoupwn.me

Page 24: x86 Mimarisi ve Tersine Mühendislik

Çalıştırma Döngüsü

➔ Ufak adam öncelikle çalıştıracağı talimatı (instruction) barındıran posta kutusunun numarasını öğrenmek için program sayacına bakar.

➔ Sayaçta gördüğü numaradaki posta kutusundan zarfı alır ve üstündeki rakamları okur.

➔ Sayacın değeri 1 arttırır.➔ Okuduğu rakamlardan hangi talimatı gerçekleştireceğini

anlar.➔ Talimatı gerçekleştirir.➔ Adım 1'e geri döner.

www.robindimyanoglu.com Canyoupwn.me

Page 25: x86 Mimarisi ve Tersine Mühendislik

Komut Yapısı

LMC'de komutlar 3 adet rakamdan oluşuyor demiştik. Bu üç rakamdan ilki yapılacak işlemi, diğer ikisi ise işlemin etkileyeceği posta kutusu numarasını temsil eder. Üç istisna dışında bütün komutlar bu yapıdadır.➔ 1xx (ADD): xx. posta kutusunun içinde bulunan sayıyı, hesap

makinesinde yazan sayıyla topla ve sonucu hesap makinesinde tut.

www.robindimyanoglu.com Canyoupwn.me

Page 26: x86 Mimarisi ve Tersine Mühendislik

Komut Yapısı

LMC'de komutlar 3 adet rakamdan oluşuyor demiştik. Bu üç rakamdan ilki yapılacak işlemi, diğer ikisi ise işlemin etkileyeceği posta kutusu numarasını temsil eder. Üç istisna dışında bütün komutlar bu yapıdadır.➔ 1xx (ADD): xx. posta kutusunun içinde bulunan sayıyı, hesap

makinesinde yazan sayıyla topla ve sonucu hesap makinesinde tut.

➔ 2xx (SUB): xx. posta kutusunun içinde bulunan sayıyı, hesap makinesinde yazan sayıdan çıkart ve sonucu hesap makinesinde tut.

www.robindimyanoglu.com Canyoupwn.me

Page 27: x86 Mimarisi ve Tersine Mühendislik

Komut Yapısı

LMC'de komutlar 3 adet rakamdan oluşuyor demiştik. Bu üç rakamdan ilki yapılacak işlemi, diğer ikisi ise işlemin etkileyeceği posta kutusu numarasını temsil eder. Üç istisna dışında bütün komutlar bu yapıdadır.➔ 1xx (ADD): xx. posta kutusunun içinde bulunan sayıyı, hesap

makinesinde yazan sayıyla topla ve sonucu hesap makinesinde tut.

➔ 2xx (SUB): xx. posta kutusunun içinde bulunan sayıyı, hesap makinesinde yazan sayıdan çıkart ve sonucu hesap makinesinde tut.

➔ 3xx (STO): Hesap makinesinde yazan sayıyı xx. posta kutusunun içine yaz. (Bu işlem sonucunda posta kutusunda önceden bulunan sayı kaybolur)

www.robindimyanoglu.com Canyoupwn.me

Page 28: x86 Mimarisi ve Tersine Mühendislik

Komut Yapısı

➔ 5xx (LDA): xx. posta kutusunun içindeki sayıyı hesap makinesine yaz. (Bu işlem sonucunda hesap makinesinde önceden bulunan sayı kaybolur)

www.robindimyanoglu.com Canyoupwn.me

Page 29: x86 Mimarisi ve Tersine Mühendislik

Komut Yapısı

➔ 5xx (LDA): xx. posta kutusunun içindeki sayıyı hesap makinesine yaz. (Bu işlem sonucunda hesap makinesinde önceden bulunan sayı kaybolur)

➔ 6xx (BRA): Diğer komutlardan farklı olarak bu komut belli bir hafıza alanını değilde, direkt olarak program sayacını etkiler. xx olarak belirtilen değeri program sayacının içine yazar. Yani dolaylı yoldan xx. komuta atlamış olur.

www.robindimyanoglu.com Canyoupwn.me

Page 30: x86 Mimarisi ve Tersine Mühendislik

Komut Yapısı

➔ 5xx (LDA): xx. posta kutusunun içindeki sayıyı hesap makinesine yaz. (Bu işlem sonucunda hesap makinesinde önceden bulunan sayı kaybolur)

➔ 6xx (BRA): Diğer komutlardan farklı olarak bu komut belli bir hafıza alanını değilde, direkt olarak program sayacını etkiler. xx olarak belirtilen değeri program sayacının içine yazar. Yani dolaylı yoldan xx. komuta atlamış olur.

➔ 7xx (BRZ): Eğer hesap makinesindeki değer 0 (sıfır) ise program sayacının içine xx ile belirtilen değeri yazar. Yani dolaylı yoldan xx. komuta atlamış olur.

www.robindimyanoglu.com Canyoupwn.me

Page 31: x86 Mimarisi ve Tersine Mühendislik

Komut Yapısı

➔ 5xx (LDA): xx. posta kutusunun içindeki sayıyı hesap makinesine yaz. (Bu işlem sonucunda hesap makinesinde önceden bulunan sayı kaybolur)

➔ 6xx (BRA): Diğer komutlardan farklı olarak bu komut belli bir hafıza alanını değilde, direkt olarak program sayacını etkiler. xx olarak belirtilen değeri program sayacının içine yazar. Yani dolaylı yoldan xx. komuta atlamış olur.

➔ 7xx (BRZ): Eğer hesap makinesindeki değer 0 (sıfır) ise program sayacının içine xx ile belirtilen değeri yazar. Yani dolaylı yoldan xx. komuta atlamış olur.

➔ 8xx (BRP): Eğer hesap makinesindeki değer 0'dan büyükse program sayacının içine xx ile belirtilen değeri yazar.

www.robindimyanoglu.com Canyoupwn.me

Page 32: x86 Mimarisi ve Tersine Mühendislik

Komut Yapısı

➔ 901 (INP): Ilk istisnamız olan bu komut, input sepetinden girdi alıp bu değeri hesap makinesinin içine yazar.

www.robindimyanoglu.com Canyoupwn.me

Page 33: x86 Mimarisi ve Tersine Mühendislik

Komut Yapısı

➔ 901 (INP): Ilk istisnamız olan bu komut, input sepetinden girdi alıp bu değeri hesap makinesinin içine yazar.

➔ 902 (OUT): Ikinci istisnamız olan bu komut ise hesap makinesindeki değeri output sepetine koyar, yani çıktı verir.

www.robindimyanoglu.com Canyoupwn.me

Page 34: x86 Mimarisi ve Tersine Mühendislik

Komut Yapısı

➔ 901 (INP): Ilk istisnamız olan bu komut, input sepetinden girdi alıp bu değeri hesap makinesinin içine yazar.

➔ 902 (OUT): Ikinci istisnamız olan bu komut ise hesap makinesindeki değeri output sepetine koyar, yani çıktı verir.

➔ 444 (COB): Son istisnamız olan bu komut ise programın bittiğini ima eder.

www.robindimyanoglu.com Canyoupwn.me

Page 35: x86 Mimarisi ve Tersine Mühendislik

Örnek Uygulama (for döngüsü)

Adres komut kaba kod01: IN cin >> start02: STO 0103: IN cin >> end04: STO 0205: IN cin step06: STO 03 <=07: LDA 01 | t = start08: ADD 03 | t += step09: OUT | cout << t10: STO 01 | start = t11: LDA 02 | t = end12: SUB 01 | t -= start13: BRP 06 == if (t > 0): goto 06 14: COB exit

www.robindimyanoglu.com Canyoupwn.me

Page 36: x86 Mimarisi ve Tersine Mühendislik

3. Bölüm: Ucundan Azcık..

www.robindimyanoglu.com Canyoupwn.me

Page 37: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Register Nedir?● İşlemci üzerinde yer alan, veri tutmaya yarayan

bellek alanları.

www.robindimyanoglu.com Canyoupwn.me

Page 38: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Register Nedir?● İşlemci üzerinde yer alan, veri tutmaya yarayan

bellek alanları.● 32 bit işlemcilerde her bir registerın boyutu 32 bittir.

www.robindimyanoglu.com Canyoupwn.me

Page 39: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Register Nedir?● İşlemci üzerinde yer alan, veri tutmaya yarayan

bellek alanları.● 32 bit işlemcilerde her bir registerın boyutu 32 bittir.● Farklı amaçlarda kullanılmak üzere register grupları

bulunur.

www.robindimyanoglu.com Canyoupwn.me

Page 40: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Register Nedir?● İşlemci üzerinde yer alan, veri tutmaya yarayan

bellek alanları.● 32 bit işlemcilerde her bir registerın boyutu 32 bittir.● Farklı amaçlarda kullanılmak üzere register grupları

bulunur.● Data registers, Pointer registers, Index registers,

Segment registers ve EFLAGS registeri.

www.robindimyanoglu.com Canyoupwn.me

Page 41: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Register Nedir?● İşlemci üzerinde yer alan, veri tutmaya yarayan

bellek alanları.● 32 bit işlemcilerde her bir registerın boyutu 32 bittir.● Farklı amaçlarda kullanılmak üzere register grupları

bulunur.● Data registers, Pointer registers, Index registers,

Segment registers ve EFLAGS registeri.● 16 ve 8 bitlik alt kısımları vardır.

www.robindimyanoglu.com Canyoupwn.me

Page 42: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

www.robindimyanoglu.com Canyoupwn.me

Page 43: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Data RegistersEAX: Akümülatör registeri. Genelde aritmetik işlemler sırasında sayıları depo etmek amacıyla kullanılır. Ayrıca syscall sırasında call id'yi tutan registerdır.

www.robindimyanoglu.com Canyoupwn.me

Page 44: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Data RegistersEAX: Akümülatör registeri. Genelde aritmetik işlemler sırasında sayıları depo etmek amacıyla kullanılır. Ayrıca syscall sırasında call id'yi tutan registerdır.EBX: Base registeri. Taban adresleri tutar. Ayrıca syscall sırasında ilk parametreyi tutan registerdır.

www.robindimyanoglu.com Canyoupwn.me

Page 45: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Data RegistersEAX: Akümülatör registeri. Genelde aritmetik işlemler sırasında sayıları depo etmek amacıyla kullanılır. Ayrıca syscall sırasında call id'yi tutan registerdır.EBX: Base registeri. Taban adresleri tutar. Ayrıca syscall sırasında ilk parametreyi tutan registerdır.ECX: Counter registeri. Döngü işlemlerinde sayaç olarak kullanılır. Ayrıca syscall sırasında 2. parametreyi tutar.

www.robindimyanoglu.com Canyoupwn.me

Page 46: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Data RegistersEAX: Akümülatör registeri. Genelde aritmetik işlemler sırasında sayıları depo etmek amacıyla kullanılır. Ayrıca syscall sırasında call id'yi tutan registerdır.EBX: Base registeri. Taban adresleri tutar. Ayrıca syscall sırasında ilk parametreyi tutan registerdır.ECX: Counter registeri. Döngü işlemlerinde sayaç olarak kullanılır. Ayrıca syscall sırasında 2. parametreyi tutar.EDX: Data registeri. I/O işlemlerinde kullanılır. Ayrıca syscall sırasında 3. parametreyi tutar.

www.robindimyanoglu.com Canyoupwn.me

Page 47: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Pointer RegistersEIP: Instruction pointer adıyla bilinen bu register, code segmentinde çalıştırılacak olan bir sonraki yönergenin adresini tutar.

www.robindimyanoglu.com Canyoupwn.me

Page 48: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Pointer RegistersEIP: Instruction pointer adıyla bilinen bu register, code segmentinde çalıştırılacak olan bir sonraki yönergenin adresini tutar.EBP: Stack frame'in taban adresini tutan register.

www.robindimyanoglu.com Canyoupwn.me

Page 49: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Pointer RegistersEIP: Instruction pointer adıyla bilinen bu register, code segmentinde çalıştırılacak olan bir sonraki yönergenin adresini tutar.EBP: Stack frame'in taban adresini tutan register.ESP: Stack frame'in tavan adresini tutan register.

www.robindimyanoglu.com Canyoupwn.me

Page 50: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Index RegistersESI & EDI: Source Index ve Destination Index registerları bazı string fonksiyonları tarafından kaynak ve hedef işaretçisi olarak kullanılırlar.

www.robindimyanoglu.com Canyoupwn.me

Page 51: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Index RegistersESI & EDI: Source Index ve Destination Index registerları bazı string fonksiyonları tarafından kaynak ve hedef işaretçisi olarak kullanılırlar.

EFLAGS RegisterÖzel bir register olan EFLAGS registerının her bir bit'i ayrı bir flag'i temsil eder.

www.robindimyanoglu.com Canyoupwn.me

Page 52: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

www.robindimyanoglu.com Canyoupwn.me

Page 53: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Interrupt Enable Flag (IF): Bu flag kernel'in INTR'lara yanıt verip vermeyeceğini belirler.

www.robindimyanoglu.com Canyoupwn.me

Page 54: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Interrupt Enable Flag (IF): Bu flag kernel'in INTR'lara yanıt verip vermeyeceğini belirler.Trap Flag (TF): Eğer bu flag etkin ise işlemci instruction'ları single-step mod da çalıştırmaya başlar.

www.robindimyanoglu.com Canyoupwn.me

Page 55: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Interrupt Enable Flag (IF): Bu flag kernel'in INTR'lara yanıt verip vermeyeceğini belirler.Trap Flag (TF): Eğer bu flag etkin ise işlemci instruction'ları single-step mod da çalıştırmaya başlar.Carry Flag (CF): Bir aritmetik işlem sonucunda elde kalan bir değer varmı onu öğrenmek için kullanılır.

www.robindimyanoglu.com Canyoupwn.me

Page 56: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Interrupt Enable Flag (IF): Bu flag kernel'in INTR'lara yanıt verip vermeyeceğini belirler.Trap Flag (TF): Eğer bu flag etkin ise işlemci instruction'ları single-step mod da çalıştırmaya başlar.Carry Flag (CF): Bir aritmetik işlem sonucunda elde kalan bir değer varmı onu öğrenmek için kullanılır.Parity Flag (PF): Bir (binary) sayının içindeki 1'lerin sayısı çift ise bu bit 1 değerini alır.

www.robindimyanoglu.com Canyoupwn.me

Page 57: x86 Mimarisi ve Tersine Mühendislik

Ucundan Azcık..

Interrupt Enable Flag (IF): Bu flag kernel'in INTR'lara yanıt verip vermeyeceğini belirler.Trap Flag (TF): Eğer bu flag etkin ise işlemci instruction'ları single-step mod da çalıştırmaya başlar.Carry Flag (CF): Bir aritmetik işlem sonucunda elde kalan bir değer varmı onu öğrenmek için kullanılır.Parity Flag (PF): Bir (binary) sayının içindeki 1'lerin sayısı çift ise bu bit 1 değerini alır.Zero Flag (ZF): Bir aritmetik işlemin sonucu 0 ise bu bit 1 değerini alır. Karşılaştırma işlemleri için sıkça kullanılır.

www.robindimyanoglu.com Canyoupwn.me

Page 58: x86 Mimarisi ve Tersine Mühendislik

4. Bölüm: Masaüstünde durduğu gibi durmuyor!

www.robindimyanoglu.com Canyoupwn.me

Page 59: x86 Mimarisi ve Tersine Mühendislik

Masaüstünde durduğu gibi durmuyor!

www.robindimyanoglu.com Canyoupwn.me

Page 60: x86 Mimarisi ve Tersine Mühendislik

Masaüstünde durduğu gibi durmuyor!

Text Segment a.k.a. Code SegmentText segment, veya diğer adıyla Code segment hafızada program kodlarının bulunduğu alandır. Tabi bu kodların makine kodu olduğunu belirtmekte fayda var. Genellikle Read-Only olarak işaretlidir.

www.robindimyanoglu.com Canyoupwn.me

Page 61: x86 Mimarisi ve Tersine Mühendislik

Masaüstünde durduğu gibi durmuyor!

Data SegmentData segment programdaki global değişkenlerin tutulduğu alandır. Bu segmentin boyutu programın derlenmesi sırasında derleyici tarafından belirlenir ve çalışma esnasında bir daha değişmez. Bu değişkenlerin değeri program içerisinde sonradan değiştirilebileceği için Data segmenti Read-Write olarak işaretlidir.

www.robindimyanoglu.com Canyoupwn.me

Page 62: x86 Mimarisi ve Tersine Mühendislik

Masaüstünde durduğu gibi durmuyor!

BSS SegmentBu segmentte değeri henüz belirlenmemiş olan static değişkenler yer alır. Değeri belirlenene kadar bu alanın içerisi 0'lar ile doludur yani bir nevi boştur. Bu tür değişkenlerin değeri ise programın çalışma sırasında belirlenir.

www.robindimyanoglu.com Canyoupwn.me

Page 63: x86 Mimarisi ve Tersine Mühendislik

5. Bölüm: Aşağı tükürsen Heap, yukarı tükürsen Stack

www.robindimyanoglu.com Canyoupwn.me

Page 64: x86 Mimarisi ve Tersine Mühendislik

Aşağı tükürsen Heap, yukarı tükürsen Stack

Stack (Yığın) Hafızası● Lokal değişkenlerin tutulduğu alandır.

www.robindimyanoglu.com Canyoupwn.me

Page 65: x86 Mimarisi ve Tersine Mühendislik

Aşağı tükürsen Heap, yukarı tükürsen Stack

Stack (Yığın) Hafızası● Lokal değişkenlerin tutulduğu alandır.● Veriler üst üste yığılmış halde

depolanır.

www.robindimyanoglu.com Canyoupwn.me

Page 66: x86 Mimarisi ve Tersine Mühendislik

Aşağı tükürsen Heap, yukarı tükürsen Stack

Stack (Yığın) Hafızası● Lokal değişkenlerin tutulduğu alandır.● Veriler üst üste yığılmış halde

depolanır.● LIFO yapısındadır.

www.robindimyanoglu.com Canyoupwn.me

Page 67: x86 Mimarisi ve Tersine Mühendislik

Aşağı tükürsen Heap, yukarı tükürsen Stack

Stack (Yığın) Hafızası● Lokal değişkenlerin tutulduğu alandır.● Veriler üst üste yığılmış halde

depolanır.● LIFO yapısındadır.● Sadece iki türlü işlem yapılabilir;

push ve pop.

www.robindimyanoglu.com Canyoupwn.me

Page 68: x86 Mimarisi ve Tersine Mühendislik

Aşağı tükürsen Heap, yukarı tükürsen Stack

Stack (Yığın) Hafızası● Lokal değişkenlerin tutulduğu alandır.● Veriler üst üste yığılmış halde

depolanır.● LIFO yapısındadır.● Sadece iki türlü işlem yapılabilir;

push ve pop.● Boyutu derlenme sırasında hesaplanır,

çalışma esnasında bir daha değişmez.

www.robindimyanoglu.com Canyoupwn.me

Page 69: x86 Mimarisi ve Tersine Mühendislik

Aşağı tükürsen Heap, yukarı tükürsen Stack

Stack (Yığın) Hafızası● Lokal değişkenlerin tutulduğu alandır.● Veriler üst üste yığılmış halde

depolanır.● LIFO yapısındadır.● Sadece iki türlü işlem yapılabilir;

push ve pop.● Boyutu derlenme sırasında hesaplanır,

çalışma esnasında bir daha değişmez.● Her fonksiyonun kendi stack frame'i bulunur.

www.robindimyanoglu.com Canyoupwn.me

Page 70: x86 Mimarisi ve Tersine Mühendislik

Aşağı tükürsen Heap, yukarı tükürsen Stack

Stack kullanımına örnek

www.robindimyanoglu.com Canyoupwn.me

Page 71: x86 Mimarisi ve Tersine Mühendislik

Aşağı tükürsen Heap, yukarı tükürsen Stack

Stack kullanımına örnek:

www.robindimyanoglu.com Canyoupwn.me

Page 72: x86 Mimarisi ve Tersine Mühendislik

Aşağı tükürsen Heap, yukarı tükürsen Stack

Heap Hafızası● Linked-list yapısındadır.

www.robindimyanoglu.com Canyoupwn.me

Page 73: x86 Mimarisi ve Tersine Mühendislik

Aşağı tükürsen Heap, yukarı tükürsen Stack

Heap Hafızası● Linked-list yapısındadır.● Değişken boyutludur.

www.robindimyanoglu.com Canyoupwn.me

Page 74: x86 Mimarisi ve Tersine Mühendislik

Aşağı tükürsen Heap, yukarı tükürsen Stack

Heap Hafızası● Linked-list yapısındadır.● Değişken boyutludur.● malloc, calloc, realloc benzeri

fonksiyonlar ile çalışma anındaistenen boyutta hafıza alanıtahsis edilir ve kullanılır.

www.robindimyanoglu.com Canyoupwn.me

Page 75: x86 Mimarisi ve Tersine Mühendislik

Aşağı tükürsen Heap, yukarı tükürsen Stack

Heap Hafızası● Linked-list yapısındadır.● Değişken boyutludur.● malloc, calloc, realloc benzeri

fonksiyonlar ile çalışma anındaistenen boyutta hafıza alanıtahsis edilir ve kullanılır.

● Artık kullanılmayacak olan hafıza alanları free fonksiyonu ile sisteme geri iade edilir.

www.robindimyanoglu.com Canyoupwn.me

Page 76: x86 Mimarisi ve Tersine Mühendislik

Aşağı tükürsen Heap, yukarı tükürsen Stack

Heap Hafızası● Linked-list yapısındadır.● Değişken boyutludur.● malloc, calloc, realloc benzeri

fonksiyonlar ile çalışma anındaistenen boyutta hafıza alanıtahsis edilir ve kullanılır.

● Artık kullanılmayacak olan hafıza alanları free fonksiyonu ile sisteme geri iade edilir.

● Bu segmentin boyutu belli değildir ve çalışma esnasında sürekli değişir.

www.robindimyanoglu.com Canyoupwn.me

Page 77: x86 Mimarisi ve Tersine Mühendislik

Heap kullanımına örnek:

Aşağı tükürsen Heap, yukarı tükürsen Stack

www.robindimyanoglu.com Canyoupwn.me

Page 78: x86 Mimarisi ve Tersine Mühendislik

6. Bölüm: Tam gaz..

www.robindimyanoglu.com Canyoupwn.me

Page 79: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Makine dili nedir?Bir işlemcinin belirli işleri yapmasını sağlayan komutlardır. Her mimarinin kendine özel komut seti vardır (x86, x86_64, MIPS, ARM ...).En düşük seviyeli programlama dilidir. Komutlar tamamen 1 ve 0'lardan oluşur

Assembly nedir?Makine dili ile bir program yazmak oldukça zahmetli bir iştir. Kullanımını kolaylaştırmak amacıyla makine dilindeki her komuta isim verilmiş ve komutların kullanımı belli bir kurala oturtulmuştur. Bu yapının oluşturduğu dillere Assembly denir.

www.robindimyanoglu.com Canyoupwn.me

Page 80: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Aritmetik komutlar:

inc reg -> reg++

www.robindimyanoglu.com Canyoupwn.me

Page 81: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Aritmetik komutlar:

inc reg -> reg++dec reg -> reg--

www.robindimyanoglu.com Canyoupwn.me

Page 82: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Aritmetik komutlar:

inc reg -> reg++dec reg -> reg--add dest, src -> dest += src

www.robindimyanoglu.com Canyoupwn.me

Page 83: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Aritmetik komutlar:

inc reg -> reg++dec reg -> reg--add dest, src -> dest += srcsub dest, src -> dest -= src

www.robindimyanoglu.com Canyoupwn.me

Page 84: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Aritmetik komutlar:

inc reg -> reg++dec reg -> reg--add dest, src -> dest += srcsub dest, src -> dest -= srcmul factor -> eax *= factor

www.robindimyanoglu.com Canyoupwn.me

Page 85: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Aritmetik komutlar:

inc reg -> reg++dec reg -> reg--add dest, src -> dest += srcsub dest, src -> dest -= srcmul factor -> eax *= factordiv divisor -> eax /= divisor

www.robindimyanoglu.com Canyoupwn.me

Page 86: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Boolean Cebiri:

AND op1, op2 -> op1 &= op2

www.robindimyanoglu.com Canyoupwn.me

Page 87: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Boolean Cebiri:

AND op1, op2 -> op1 &= op2OR op1, op2 -> op1 |= op2

www.robindimyanoglu.com Canyoupwn.me

Page 88: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Boolean Cebiri:

AND op1, op2 -> op1 &= op2OR op1, op2 -> op1 |= op2XOR op1, op2 -> op1 ^= op2

www.robindimyanoglu.com Canyoupwn.me

Page 89: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Boolean Cebiri:

AND op1, op2 -> op1 &= op2OR op1, op2 -> op1 |= op2XOR op1, op2 -> op1 ^= op2TEST op1, op2 -> ZF = op1 & op2

www.robindimyanoglu.com Canyoupwn.me

Page 90: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Boolean Cebiri:

AND op1, op2 -> op1 &= op2OR op1, op2 -> op1 |= op2XOR op1, op2 -> op1 ^= op2TEST op1, op2 -> ZF = op1 & op2NOT operand -> !operand

www.robindimyanoglu.com Canyoupwn.me

Page 91: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Karşılaştırma ve jump:jmp addr -> koşulsuz jump

www.robindimyanoglu.com Canyoupwn.me

Page 92: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Karşılaştırma ve jump:jmp addr -> koşulsuz jumpcmp dest, src -> (dest == src)?

www.robindimyanoglu.com Canyoupwn.me

Page 93: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Karşılaştırma ve jump:jmp addr -> koşulsuz jumpcmp dest, src -> (dest == src)?je addr -> if(dest == src): jmp addr

www.robindimyanoglu.com Canyoupwn.me

Page 94: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Karşılaştırma ve jump:jmp addr -> koşulsuz jumpcmp dest, src -> (dest == src)?je addr -> if(dest == src): jmp addrjne addr -> if(dest != src): jmp addr

www.robindimyanoglu.com Canyoupwn.me

Page 95: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Karşılaştırma ve jump:jmp addr -> koşulsuz jumpcmp dest, src -> (dest == src)?je addr -> if(dest == src): jmp addrjne addr -> if(dest != src): jmp addrjg addr -> if(dest > src): jmp addr

www.robindimyanoglu.com Canyoupwn.me

Page 96: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Karşılaştırma ve jump:jmp addr -> koşulsuz jumpcmp dest, src -> (dest == src)?je addr -> if(dest == src): jmp addrjne addr -> if(dest != src): jmp addrjg addr -> if(dest > src): jmp addrjge addr -> if(dest >= src): jmp addr

www.robindimyanoglu.com Canyoupwn.me

Page 97: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Karşılaştırma ve jump:jmp addr -> koşulsuz jumpcmp dest, src -> (dest == src)?je addr -> if(dest == src): jmp addrjne addr -> if(dest != src): jmp addrjg addr -> if(dest > src): jmp addrjge addr -> if(dest >= src): jmp addrjp addr -> if(dest-src > 0): jmp addr

www.robindimyanoglu.com Canyoupwn.me

Page 98: x86 Mimarisi ve Tersine Mühendislik

Tam gaz..

Ve en önemli temel komutu unutmayalım..

MOV dest, src -> dest = src

www.robindimyanoglu.com Canyoupwn.me

Page 99: x86 Mimarisi ve Tersine Mühendislik

Ara vakti..

www.robindimyanoglu.com Canyoupwn.me

Page 100: x86 Mimarisi ve Tersine Mühendislik

One ring to rule 'em all

System Calls● Kernel ile userland arasındaki köprü.

www.robindimyanoglu.com Canyoupwn.me

Page 101: x86 Mimarisi ve Tersine Mühendislik

One ring to rule 'em all

System Calls● Kernel ile userland arasındaki köprü.● Kernelin sunduğu hizmetleri assembly aracılığıyla

kullanabilmemizi sağlayan arayüz.

www.robindimyanoglu.com Canyoupwn.me

Page 102: x86 Mimarisi ve Tersine Mühendislik

One ring to rule 'em all

System Calls● Kernel ile userland arasındaki köprü.● Kernelin sunduğu hizmetleri assembly aracılığıyla

kullanabilmemizi sağlayan arayüz.● open, read, write, close, wait, exec, fork, exit, kill bu

fonksiyonlardan bazıları

www.robindimyanoglu.com Canyoupwn.me

Page 103: x86 Mimarisi ve Tersine Mühendislik

One ring to rule 'em all

System Calls● Kernel ile userland arasındaki köprü.● Kernelin sunduğu hizmetleri assembly aracılığıyla

kullanabilmemizi sağlayan arayüz.● open, read, write, close, wait, exec, fork, exit, kill bu

fonksiyonlardan bazıları● eax, ebx, ecx, edx, esx ve edi olmak üzere 6 adet

argümanı vardır.

www.robindimyanoglu.com Canyoupwn.me

Page 104: x86 Mimarisi ve Tersine Mühendislik

One ring to rule 'em all

System Calls● Kernel ile userland arasındaki köprü.● Kernelin sunduğu hizmetleri assembly aracılığıyla

kullanabilmemizi sağlayan arayüz.● open, read, write, close, wait, exec, fork, exit, kill bu

fonksiyonlardan bazıları● eax, ebx, ecx, edx, esx ve edi olmak üzere 6 adet

argümanı vardır.● int 0x80 kesmesiyle aktifleştirilir.

www.robindimyanoglu.com Canyoupwn.me

Page 105: x86 Mimarisi ve Tersine Mühendislik

One ring to rule 'em all

www.robindimyanoglu.com Canyoupwn.me

Page 106: x86 Mimarisi ve Tersine Mühendislik

One ring to rule 'em all

section .text

_start: mov eax, 0x4 ; eax = sys_write() mov ebx, 0x1 ; ebx = stdout mov ecx, message ; ecx = &message mov edx, 0xF ; edx = mesajın uzunluğu int 0x80 ; kernel interrupt

mov eax, 0x1 ; eax = sys_exit() mov ebx, 0x0 ; ebx = return değeri int 0x80 ; kernel interrupt

section .data message: db "Hello, World!", 0dh, 0ah

www.robindimyanoglu.com Canyoupwn.me

Page 107: x86 Mimarisi ve Tersine Mühendislik

7. Bölüm: Sudan karaya geçiş

www.robindimyanoglu.com Canyoupwn.me

Page 108: x86 Mimarisi ve Tersine Mühendislik

Sudan karaya geçiş

Fonksiyon argümanları:

www.robindimyanoglu.com Canyoupwn.me

Page 109: x86 Mimarisi ve Tersine Mühendislik

Sudan karaya geçiş

Fonksiyon argümanları:

Fonksiyon çağırma:

www.robindimyanoglu.com Canyoupwn.me

Page 110: x86 Mimarisi ve Tersine Mühendislik

Sudan karaya geçiş

Fonksiyon Return:

www.robindimyanoglu.com Canyoupwn.me

Page 111: x86 Mimarisi ve Tersine Mühendislik

Sudan karaya geçiş

Fonksiyon Return:

If – Else:

www.robindimyanoglu.com Canyoupwn.me

Page 112: x86 Mimarisi ve Tersine Mühendislik

Sudan karaya geçiş

Döngüler:

www.robindimyanoglu.com Canyoupwn.me

Page 113: x86 Mimarisi ve Tersine Mühendislik

Sudan karaya geçiş

Dizi Elemanlarına Erişim:

www.robindimyanoglu.com Canyoupwn.me

Page 114: x86 Mimarisi ve Tersine Mühendislik

Sudan karaya geçiş

Dizi Elemanlarına Erişim:

Değer Atama:

www.robindimyanoglu.com Canyoupwn.me

Page 115: x86 Mimarisi ve Tersine Mühendislik

Sudan karaya geçiş

www.robindimyanoglu.com Canyoupwn.me

Page 116: x86 Mimarisi ve Tersine Mühendislik

Araç çantası

Tersine Mühendislik sırasında kullanılan araçlardan bazıları:● file -> Bir dosyanın türünü öğrenmemizi sağlar

www.robindimyanoglu.com Canyoupwn.me

Page 117: x86 Mimarisi ve Tersine Mühendislik

Araç çantası

Tersine Mühendislik sırasında kullanılan araçlardan bazıları:● file -> Bir dosyanın türünü öğrenmemizi sağlar● strings -> Bir dosyanın içindeki ASCII stringleri gösterir

www.robindimyanoglu.com Canyoupwn.me

Page 118: x86 Mimarisi ve Tersine Mühendislik

Araç çantası

Tersine Mühendislik sırasında kullanılan araçlardan bazıları:● file -> Bir dosyanın türünü öğrenmemizi sağlar● strings -> Bir dosyanın içindeki ASCII stringleri gösterir● readelf -> Bir ELF dosyası hakkında bilgi verir

www.robindimyanoglu.com Canyoupwn.me

Page 119: x86 Mimarisi ve Tersine Mühendislik

Araç çantası

Tersine Mühendislik sırasında kullanılan araçlardan bazıları:● file -> Bir dosyanın türünü öğrenmemizi sağlar● strings -> Bir dosyanın içindeki ASCII stringleri gösterir● readelf -> Bir ELF dosyası hakkında bilgi verir● objdump -> Bir object dosyası hakkında çeşitli bilgiler verir

www.robindimyanoglu.com Canyoupwn.me

Page 120: x86 Mimarisi ve Tersine Mühendislik

Araç çantası

Tersine Mühendislik sırasında kullanılan araçlardan bazıları:● file -> Bir dosyanın türünü öğrenmemizi sağlar● strings -> Bir dosyanın içindeki ASCII stringleri gösterir● readelf -> Bir ELF dosyası hakkında bilgi verir● objdump -> Bir object dosyası hakkında çeşitli bilgiler verir● ltrace -> Programın yaptığı kütüphane çağrılarını gösterir

www.robindimyanoglu.com Canyoupwn.me

Page 121: x86 Mimarisi ve Tersine Mühendislik

Araç çantası

Tersine Mühendislik sırasında kullanılan araçlardan bazıları:● file -> Bir dosyanın türünü öğrenmemizi sağlar● strings -> Bir dosyanın içindeki ASCII stringleri gösterir● readelf -> Bir ELF dosyası hakkında bilgi verir● objdump -> Bir object dosyası hakkında çeşitli bilgiler verir● ltrace -> Programın yaptığı kütüphane çağrılarını gösterir● strace -> Programın yaptığı sistem çağrılarını gösterir

www.robindimyanoglu.com Canyoupwn.me

Page 122: x86 Mimarisi ve Tersine Mühendislik

Araç çantası

Tersine Mühendislik sırasında kullanılan araçlardan bazıları:● file -> Bir dosyanın türünü öğrenmemizi sağlar● strings -> Bir dosyanın içindeki ASCII stringleri gösterir● readelf -> Bir ELF dosyası hakkında bilgi verir● objdump -> Bir object dosyası hakkında çeşitli bilgiler verir● ltrace -> Programın yaptığı kütüphane çağrılarını gösterir● strace -> Programın yaptığı sistem çağrılarını gösterir● gdb -> The GNU Debugger <3

www.robindimyanoglu.com Canyoupwn.me

Page 123: x86 Mimarisi ve Tersine Mühendislik

Araç Çantası

Debugger nedir?● Kelime anlamı: “Hata Ayıklayıcı”

www.robindimyanoglu.com Canyoupwn.me

Page 124: x86 Mimarisi ve Tersine Mühendislik

Araç Çantası

Debugger nedir?● Kelime anlamı: “Hata Ayıklayıcı”● Programın işleyişini detaylıca incelememize fırsat veren araç.

www.robindimyanoglu.com Canyoupwn.me

Page 125: x86 Mimarisi ve Tersine Mühendislik

Araç Çantası

Debugger nedir?● Kelime anlamı: “Hata Ayıklayıcı”● Programın işleyişini detaylıca incelememize fırsat veren araç.● Programı istediğimiz yerden başlatma/durdurma (breakpoint).

www.robindimyanoglu.com Canyoupwn.me

Page 126: x86 Mimarisi ve Tersine Mühendislik

Araç Çantası

Debugger nedir?● Kelime anlamı: “Hata Ayıklayıcı”● Programın işleyişini detaylıca incelememize fırsat veren araç.● Programı istediğimiz yerden başlatma/durdurma (breakpoint).● Hafıza içeriğini inceleme/değiştirme (examine).

www.robindimyanoglu.com Canyoupwn.me

Page 127: x86 Mimarisi ve Tersine Mühendislik

FIN

UYGULAMA ZAMANI!

www.robindimyanoglu.com Canyoupwn.meCanyoupwn.me