Ana içeriğe atla

Linux Notları-2 Boot ve Deamons

    Önceki yazıda işlemcinin ilk çalışma anında işemcinin üreticisi tarafından belirlenmiş bir adrese gittiğini söylemiştik ve orda kalmıştık. "Peki bu adrete ne var" sorusuyla bırakmıştık. Bu adresin bir bios çipine map edildiğini biliyoruz.(Burada biosun kendi kodunu RAM üzerine kopyalaması, shadowing, bit twiddling gibi konuları atılıyorum detay için bakabilirsiniz) Bu adreste işlemcinin çalıştıracağı ilk komut var. Şimdi bu komutu görelim ne iş yaptığına bakalım. Bunu görmenin bir kaç yolu var elbette ama ben mümkün olduğunca basit ve anlatılabilir olanı kullanacağım.

    Tersine mühendislik yaptığımızda kaynak kodla karşılaştırabilmemiz için bios firmware sizin için ulaşılabilir yani açık kaynak olmalı. Ben VirtualBox için ve Qemu için kaynak kodları karşılaştıracağım. Fiziksel makineniz içinde aynı durum söz konusu ise ulaşabiliyorsanız window üzerinde Physical Memory Viewer kullanarak yazıyı takip edebilirsiniz veya IDA pro vs gibi bir program kullanabilirsiniz. Linux ise fiziksel makineniz bu yazıyı olduğu gibi aynı araçlarla takip edebilirsiniz. Bunun yanında işleri karmaşıklaştırdıkça, yazının ilerleyen kısımlarında Radare2 ile  terminal arayüzü ve Cutter gui ile tersine mühendislik araçlarını biraz kullanmış olacağız.

        Önce 0x0 ile 0xF_FFFF adresleri arasındaki 1 MB alanı okuyalım.
1. Eğer Windows üzerinde çalışıyorsanız WinDbg Preview(modern versiyonu WinDbg nin), WinDbg, Pyhsical Memory Viewer ve kolayca bir hafızayı okuyan hex editor vs kullanabilirsiniz. Bu araçları admin modda çalıştırmanız gerekebilir. WinDbg kullanmanızı öneririm. Bu aracı Windows SDK yükleyicisinden sadece Debug Tools kısmını seçerek yükleyebilirsiniz. Veya doğrudan WinDbg Preview indirip kurabilirsiniz. 
    Bu araçları kernel mode da admin olarak çalıştırıp kullanmalısız. Öncesinde kernel mode açabilmeniz için yine admin modda bir komut satırına 
bcdedit -debug on
yazarak ve bilgisayarınızı yeniden başlatarak, kernel mode local işlemler yapabilmenizi sağlayabilirsiniz. Aşağıdaki gibi !db komutuyla F000 adresinden başlayarak 10000 adet 8 bitlik parçayı okuyabilirsiniz hafızadan.



WinDbg Preview için


Veya WinDbg aracının yüklü olduğu klasörde komut satırına
kd -kl
yazıp kd aracını kernel modda çalıştırarak

!db 0F000 L 10000

yazıp yine aynı şekilde okuma yapabilirsiniz.


2. Sanal makinenizde de olsa bir linux dağıtımınız varsa -ki sonraki anlatımlarda windows alternatiflerini anlatmak işimizi oldukça uzatacak o yüzden devamında yalnızsınız, sanal makine kurmak sizinde işinize gelebilir.- şunları yapabilirsiniz:
    Önce hafızanın tamamına erişebilmeniz için kernel iniz CONFIG_STRICT_DEVMEM=y parametresiyle derlenmemiş olmalı. Bizim ihtiyacımı alan şu anda bu sınırların içerisinde dağıtımınıza göre 1MB ve üstü bir sınır olabilir. Eğer full erişim istiyorsanız şu adrese ve şu adrese bakabilirsiniz.
    İhtiyacımız olan GNU dd (dd kısaltması nerden gelir) aracı. Bu araç bir dosyanı bir bölümünü kopyalamak üzrinde işlem yapmak için kulanılır. Hani linux ta herşey dosya yada dosya betimleyicisi ya, hafızayı da bir dosya olarak görüp adresini vememiz yeterli... dd aracına vereceğimiz if(input file) parametresi /dev/mem olacak.
sudo dd if=/dev/mem bs=1024 count=1024
Bu bize 1024 byte uzunluğunda 1024 adet parçayı hafızanın başından(daha doğrusu 0x0 adresinden) başlayarak kopyalayıp verir
sudo dd if=/dev/mem bs=1024 count=1024 of=birdosya.data 
veya
sudo dd if=/dev/mem bs=1024 count=1024 > birdosya.data 
ile bir dosyaya yazdırabiliriz. Veya hexdump aracını kullanıp -C (canonical) parametresiyle geleneksel biçimde (ascii ve hex) doğrudan görebiliriz
sudo dd if=/dev/mem bs=1204 count=1024 | hexdump -C 
hexdump aracı tekrar eden satırları sıkıştırıp (*) ile gösterir isterseniz -v parametresini ekleyerek iptal edebilirsiniz

Sonuçta bu adreste ne olduğunu görmek için yeterli araçlarımız var. ve 0xF_FFF0 adresinde
ea 5b e0 00 f0 ... şeklinde bir kod bulduk.IBM PC lerin Memory Map lerine bakarsak 0xC0000 ile 0xFFFF0 adresleri arasının bios ROM için ayrıldığını görürüz.(256 KB) (tasarıma görebu aralıklar değişebilir). Bu aralığın son 16 byte-ı ise; bir far jump kodu (5 byte), tarih(8 byte), kullanılmayan 2 byte ve son olarak Machine ID (1 byte) olarak belirlenmiştir. şu adresten daha detaylı inceleyebilirsiniz, Memory Map veya buradan.
Bu 5 byte asm kodu (aslında ilk bahsettiğimiz bootstrap mantığı gereği bir bios bootrap kodu denebilir) disassembler yardımıyla görebiliriz. objdump, ndisasm vs kullanabiliriz ama önce radare2 araçlarını kullanalım.(kali linux kullanıyorsanız kurulu paketlerin içinde var)
rasm2 -d -a x86 -b16 'ea5be000f0'
veya biraz çetrefilli bir yol olsada şimdilik sadece görebilmek için aşağıdakini kopyala yapıştır yapabilirsiniz
echo 0000: ea 5b e0 00 f0 | xxd -r > bisey && objdump -D -m i8086  -b binary bisey
konuyu dağıtmamak için burdaki araçların ne iş yaptığını şimdilik atlıyorum ilerde detaylarına değineceğiz. Bir diğer yol da bu 5 byte kodu alıp kullandığınız herhangi bir diassembler ile açmak veya su sayfayı kullanabilirsiniz. Bit mode olarak 16 bit seçtiğinizden emin olmalısınız. 


veya bu sayfayı bu sayfada da platform butonuna tıklayıp mode için i8086 seçmelisiniz.

 Bu 16 bit(veya i8086 modu yukarıdaki site için) meselesinden real mode protected mode konularında tekrar bahsedeceğiz. Bu aşamadan sonra bir süre radare2 aracını kullanıp bios kodu üzerinde tersine mühendilik yapacağız sonra kendi mini bios kodumuzu yazacağız. Şimdilik bu far jump veya long jump assembly kodunun bizi bios kodunda bir noktaya gönderdiğini, ve bios kodunun işini yapmaya başlayacağını söylemekle yetinelim.

Kaynaklar

0.Serinin önceki yazısındaki kaynaklar...

1. https://css.csail.mit.edu/6.858/2014/readings/i386.pdf , Intel 80386 Programmer's reference manual

2.Microprocessor and Microcomputer Technology,Noel M. Morris

3.The Indispensable PC Hardware Book,Hans-Peter Messmer


Yorumlar

Bu blogdaki popüler yayınlar

Linux Notları-1 Boot ve Deamons

       " Booting " kelimesi ile bilgisayarın başlatılması için kullanılan alışılmış bir terim. " Bootstrapping " kelimesinin kısa formu. " Bootstrap " sözlükte başkalarının yardımı olmadan kendi kendini idame ettirmek gibi bir kaç anlamı var ama buraya en uygun olanı şu olabilir: En az kaynakla bir şey yaratma, oluşturma, başlatma yaklaşımı. Bilgisayar terimi olarak, bir programı çalıştırmak için(genelde bir işletim sistemini veya mini bir çekirdeği) önce daha küçük bir program yükleyeme süreci.     Boot süreci sonunda, kernel hafızaya yüklenir ve çalışmaya hazır hale gelir, önceliği yüksek programlar, başlangıç betikleri çalıştırılır ve sistem kullanıcılar için hazır hale getirilir. Aşağıdaki şemada bunun genel bir özetini görebilirsiniz:     Bir bilgisayar en kaba tabirle; üzerindeki işlemcinin, hafızadaki(RAM) adreslerin içindeki ikili kodu, sırayla anlamlandırıp çalıştıran bir cihaz. Tanım basit olsada bu

Çalıştığım Projelerle İlgili Resimler Videolar

Akıllı Bisiklet Sistemi Operatör Panelinde Canlı İstasyon Durum Ekranları Operatör İstasyon Yönetimi Sistem Operatörünün Kullanıcı Yönetimi Paneli Bütün ziyaretçilerin harita üzerinden istasyon bilgisine ulaşabilecekleri karşılama sayfası Kabaca Sistemin Genel Yapısı Tasarlanan Peron ve Kiosk Haberleşme Devreleri TÜBİTAK Lisans Destek Projesi: Fonksiyonel Yakın Kızılötesi Spektroskopisi (fNIRS) Tabanlı Bir Beyin Bilgisayar Arayüzü Tasarımı(BBA) Çizgiötesi Üye network sistemi ve e-ticaret altyapısı