Ö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.
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.
kd -kl
!db 0F000 L 10000
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
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
Yorum Gönder