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

Kali Linux Terminal Türkçe Klavye Ve İlk Ayarlar, Programlar

1.Komut satırına aşağıdaki komutu yazarak kalvye dilinizi Türkçe’ye çevirebilirsiniz: setxkbmap tr bu geçici bir çözüm sonrasında kalıcı olsun istiyorsanız   /etc/default/keyboard   dosyasını açıp içerisindeki  XKBLAYOUT satırındaki değeri  tr olacak şekilde değiştirebilirsiniz. veya  sudo dpkg-reconfigure keyboard-configuration komutuyla klavye dil ayarlarını düzenleyebilirsiniz. 2.Güncellemeleri kontrol edelim: sudo apt-get update sudo apt-get dist-upgrade Bu komutlardan sonra işletim sistemini yeniden başlatmanızı öneririm. Terminal "reboot f" yazabilirsiniz hızlıca. 3.Linux header ları yükleyelim sudo apt-get install linux-headers-$(uname -r) 4.Sonrasında VirtualBox için Aygıtlar > Misafir eklentileri CD kalıbını yerleştir ile misafir eklentileri kalıbını sisteme bağlayalım ve terminal şu komutu verelim bash /media/cdrom/VBoxLinuxAdditions.run Sonrasında VirtualBox menüsünden Görünüm>Tam Ekran Kipi

Türkiyede Gençlik Kavramı - Yard.Doç.Dr. Gülden Demet Lüküslü

    Yard.Doç.Dr Gülden Demet Lüküslü'nün    Türkiyede Gençlik Kavramı  ' söyleşisinden aldığım bazı kısımlar:       "...İşte o yüzden sosyolog Pierre Bourdieu gençlik çalışmasını ve gençlik üzerinde yapılan akademik çalışmaları çok eleştiriyor. “Siz çalışırken sadece burjuva gençliğini çalışıyosunuz, çok ciddi sayıda olan işçi gençliğini göz ardı ediyosunuz. Sizin genç derken bahsettiğiniz kitle, daha çok öğrenci olan kitledir” diyor..."