13 Nisan 2019 Cumartesi

bios: nerede baslar bu bilgisayarin hikayesi

merhaba arkadaslar,

bugunku yazimizda, bilgisayara ilk input umuzu verip, geriye yaslandiktan sonra ta ki ikinci input u muzu verene kadar(pc acilana kadar diyelim) neler oluyor, ne isler donuyor birlikte incelemeye calisicaz.

onceki yazimizda bir cpu bir ram ver, neyleyim gerisini minvalinde, en temel bilgisayar niteliginden bahsetmistik, bilgi islemek :D

ancak hepimizin tahmin edecegi gibi ramler uzerlerine gomulu calistirilabilir kod barindirmazlar. (yoksa nasil ram degistirecektik degil mi?) calisacak kodlari birilerinin oraya yerlestirmesi ve yuru ya kulum demesi gerekir.
iste tam olarak bu kisimdan, yani, kodun ram'e gelmesi(veya gelmeden calisabilirligini mumkun kilan mekanizmayi) ve yuklenen kodun neler yapacagindan bahsedicez.

bilgisayar icin bir CPU bir RAM cizip birakmistik, artik bu olayi cetrefillestirmenin vakti gelmedi mi?


evet bir anda asiri yukleme oldu gibi ama hayat da boyle degil mi zaten?:D

CPU ile RAM arasindaki iletisim kuzey koprusu denilen chipset tarafindan kontrol edilir ve yonetiliri.
diger baglantilarin efendisi ise, guney koprusudur.(3)

ancak RAM deki adreslerin hepsi aslinda RAMde degildir. bazi alanlar cevresel aygitlar icin ayrilir ve bu bolgelere yapilan yazma ve okuma islemleri kuzey koprusu tarafindan aslinda RAM'e degil bu cihazlara yonlendirilir.(1)
ne demek istedik,

linux da
cat /proc/iomem

windowsta
https://docs.microsoft.com/en-us/sysinternals/downloads/rammap

yardimiyla fiziksel ram in hangi kisimlarinin io device lari icin ayrildigini ve ne amacla hangi aygit icin ayrildigini gorebiliriz.

ben virtual kali den (tabi kali lan heckiriz :P :D) asagidaki ciktiyi aldim.

neyse bilgisayara gucu verelim

dedigimiz zaman CPU reset vektoru denilen(2) bir adresten komut okuyup onu islemeye calisacaktir.
bu adres 32bit bir intel islemci icin 0xFFFFFFF0 adresidir ve burdan okunup islenecek kodun koprucuklerimiz tarafindan, bios kodunun basi olacak yere bir ziplama olmasi gerekmektedir. (16 bytelik alanda baska ne yapilabilir zaten degil mi?) (BIOS kodu illa ki RAM de olmak zorunda degil, chipset belli alanlara ozel anlam yukler demistik unuttuk mu? Ancak RAM'e ROM daki BIOS kodu cekilmis de olabilir. BIOS Shadowing)

hemen ornekleyelim

CPU 0xFFFFFFF0 adresinden kod okumak ister,
bunu goren chipset, reset olduk lan deyip,
JMP 0xF0000 komutunu gonderir.
CPU artik 0xF0000 adresinden kod okumak ister,
bunu goren chipset, bura BIOS lan der ve okuma istegini BIOS kodunu cekecegi cihaza yonlendirir. (Sekil 1'deki kirmizi cizikli yola dikkat)

Bu noktada genelde chipset, performans sebeplerinden oturu yukarıda parantez icinde söylediğimiz BIOS shadowing yapar. Yani calistirilacak bios kodunu once RAM'e yazar ve buradan kod isletmeye(BIOS'u calistirmaya) devam etsin diye CPU'ya BIOS kodunu yazdigi adresi JMP komutuyla doner.
ornek yukarida zaten, degisen tek sey ise, chipset 0xFFFFFFF0 adresinden kod okunmak istendigi anda BIOS'u alip 0xF0000 adresine yazar. boylece bir daha Sekil 1'deki kirmizi cizikli yolu asmak zorunda kalmadan direk olarak BIOS ROM kodunu RAM den okur, yani hizlica calistirir.

bios kodu ne yapar?
bu sorunun cevabini internetin her yerinde bulabilirsiniz fakat biraz daha ayrintili konusmak gerekirse,
 - POST yani power-on self test yapar. bagli cihazlar calisiyo mu, ram de veya sunda bunda sikinti var mi diye bi kontrol eder.
 - Ekran kartinin BIOSunu calistirir. Bu amacla 0xC0000'a zıplar. Bu adres de yine io mapped bir adrestir. Referans icin yukarida kaliden aldigim ekran goruntusune bakabilirsiniz. 0xC0000-0xC9FFF Video ROM yazan satir.
 - Sirasiyla calistirilmasi gereken baska bios varsa calistirir.
»Bu noktada aslinda BIOS'un yapmasi gereken son bir adim kalmistir, bir isletim sistemi calistirmak.
 - Isletim sistemi boot etmek icin bootable aygıt aramaya baslar. sırasıyla disklere bakar (daha oncesinden bios a ayarlanmış sıra ile)
 - Buldugunda ise MBR alanını RAM'e yukler ve kontrol artık ona devredilir.

nedir bu MBR? (Master Boot Record)
yazilarin cok uzun olmamasi nedeniyle bu MBR konusunu diger yazimiza birakiyorum.

2 Nisan 2018 Pazartesi

crackme0x01

Merhaba arkadaslar,

crackme serisine devam ediyoruz, hedef crackme0x2023 :D

crackme0x01 i indirdik ve yine, "test" inputu ile uygulamaya ilk atagimizi gerceklestirdik.
sonuc:

huussraan :)

crackme0x00 i CFF ile inceledigimizde gordugumuz strcmp kolayligi da yok :|

Aslinda printf  kolayligi hala daha var, yani bu arkadas ekrana yazmak icin diger ornekteki gibi printf kullanmis(hissediyoruz), biz normalde burdan ilerler yururduk, ama bir baska konuya deginmek adina onu da gormezden geldigimizi dusunelim.

kim cagiriyor lan bu main'i?

bugune kadar oturduk her koda main ile basladik onunla bitirdik. asagidaki gibi..

int main(int argc, char* argv[])
{
printf("merhaba");
return 0;
}

kafamiza gore main in uzerine fonksiyonlar yazip yeri geldi mainin icinden yeri geldi baska fonksiyonlarin icinden onlari cagirdik ama bir gun gelip, lan bu main'i kim cagiriyor lan diye sormadik, main fonksiyonuna ihanet ettik, onun kudretini gormezden geldik.

ama gun o gundur ki, bugun main'in hakkini verecez, onu cagiranlari bulup ortaya cikaracaz.

simdi arkadaslar, kodu yazip derle dedikten sonra hepimiz biliyoruz ki programimiz birler sifirlar birbirini kovalar seklinde binary oluyor ve calisabilir duruma getiriliyor(derleyici ve baglayici abiler sayesinde)

bende yukarida paylastigim kodu visual studio a atip derledim ve sonra onu yine debugger a attim.

export ettigim sembollere main yazip arattigimda mainCRTStartup diye bir fonksiyon vardi ve derleyicim hali hazirda buraya breakpoint koymustu.



Nedir bu mainCRTStartup?

diye sordugumda su verilere ulastim,
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\crt\src\vcruntime\mcrtexe.cpp

/***
*crtexe.c - Initialization for console EXE using CRT DLL
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       This is the actual startup routine for apps linking to the CRT DLL.
*       It calls the user's main routine [w]main() or [w]WinMain after
*       performing C Run-Time Library initialization.
*
*       With ifdefs, this source file also provides the source code for:
*       wcrtexe.c   the startup routine for console apps with wide chars
*       crtexew.c   the startup routine for Windows apps
*       wcrtexew.c  the startup routine for Windows apps with wide chars
*
*******************************************************************************/

yani sair diyor ki, her kim crt kullanirsa aslinda main'i crt i initialize ettikten sonra ben cagiririm.


hemen fonksiyon ustundeki yorumsa
/***
*mainCRTStartup(void)
*wmainCRTStartup(void)
*WinMainCRTStartup(void)
*wWinMainCRTStartup(void)
*
*Purpose:
*       These routines do the C runtime initialization, call the appropriate
*       user entry function, and handle termination cleanup.  For a managed
*       app, they then return the exit code back to the calling routine, which
*       is the managed startup code.  For an unmanaged app, they call exit and
*       never return.
*
*       Function:               User entry called:
*       mainCRTStartup          main
*       wmainCRTStartup         wmain
*       WinMainCRTStartup       WinMain
*       wWinMainCRTStartup      wWinMain
*
*Entry:
*
*Exit:
*       Managed app: return value from main() et al, or the exception code if
*                 execution was terminated by the __except guarding the call
*                 to main().
*       Unmanaged app: never return.
*
*******************************************************************************/

neyse anladik ki kral main'imizi eger crt kullanilirsa bu abilerimiz cagiriyormus.
process loading from disk adli baska, kapsamli bir yazimiz da olacak, c runtime olayi baska o baska arkadaslar, benimnde kafami karistirmayin lan :D
bu abiler ise eger soylediklerinde durustlerse c runtime icin hazirliklarini yaptiktan sonra ilgili fonksiyonumuzu cagiriyolar.
bu hazirlik kisminda temel amac,
belli basli guvenlik ayarlamalari yapmak,
parametreleri main'e gececek sekilde hazirlamak, environment variable lari da
main i cagirmak
yapilan ayarlamalari sonlandirmak
exit'e mainden donen geri donusu verip olayi sonlandirmak

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\crt\src\vcruntime\mcrtexe.cpp
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\crt\src\vcruntime\exe_common.inl
dosyalarini okuyup incelerseniz kendiniz de gorebilirsiniz.


neyse bu gereksiz bilgiye neden ihtiyac duyduk bende anlayamadim. ama main cok orselenmisti, onu yalniz birakamazdim :D
neyse kraklamaya devam diyelim

evet ikinci kez oynat ugurcum dedigimizde artik mainCRTStartup lardan birisinde durdugumuzu biliyoruz.
uzerinde durdugum adresteki koda baktigimizda da oraninda bu arkadaslara ait oldugu belli.


foto da da gorebildigimiz gibi kocaman get_mainargs isimli bir foksiyon cagrilmis, bu crt ile alakali degil de nedir?


neyse tum bunlara dusmeden, printf e breakpoint koyup buraya ulasabilirdik, deneyelim.


oynat ugurcum dedikten sonra printf te duracaktir. execute till return dedikten sonra ret instruction i gelecek (printf in sonu yani) ve orayida atla dedikten sonra


geldik mi aslinda baslamamiz gereken yere :D



neyse isaretledigim bolgeyi okudugumuz zaman anliyoruz ki,arkadas Password: yazdirdiktan sonra benden scanf ile bir sayi alip, ki bu sayiyi %d ile istiyor, yani decimal, sonrasinda da 149A hexadecimal degeri ile karsilastirip, sifre yanlis veya dogru deyip kapaniyor.
strcmp bu yuzden yokmus meger!
adam sayi istiyor bu sefer
149A = 5274

sifre bu

bir onceki krak me de yaptigimiz gibi instruction degistirip patchleyebiliriz.

hayirli reverseler diliyorum,

27 Mart 2018 Salı

crackme0x00 crackliyoruz

merhaba arkadaslar,
reverse yeteneklerimizi gelistirmek hepimizin hakki degil mi?
bu sebeple (https://github.com/Maijin/Workshop2015/tree/master/IOLI-crackme) linkinden elde edebileceginiz crackme uygulamalarini kirmaya calisicaz.
hadi crackme0x00 ile baslayalim..

kullanacagim debugger 'i https://x64dbg.com/ adresinden edilebilirsiniz.

oncelikle uygulamamizi calistiralim bi degil mi?

evet uygulama benden sifre istedi ve bende test amacli test yazip gonderdim, fakat tabiki tutmadi:D

neyse uygulamayi debuggerimiza alalim.
debugger cok erken durdu, henuz ntdll in icindeyiz, bir kere oynat ugurcum (run tusu, play tusu) dedigimizde programin entry point'inden yerlestirmis oldugu breakpoint te tekrar duracaktir.


evet giris noktasinda durduk.

buraya kadar geldikten sonra aklimizda su deli sorular canlaniyor. 
- Uygulama sifresi uygulama icinde mi sakli yoksa network e erisim mi var?
- Uygulama sifresi dogrulugu kontrol u(string comparison) uygulama tarafindan mi yapiliyor yoksa bir api cagrisi mi var?

ben size soyleyeyim, network olayi yok, basit bir test uygulamasi cunku, gercek bi kanitim falan da yok hee yalnizca hislerime guveniyorum :D
ikinci soru icin ise uygulamanin import ve export ettigi dll ve cagrilara bakmayi uygun goruyorum
hemen cff explorer 'i acip, exe yi uzerine surukledigimizde soyle bir manzarayla karsilasmaktayiz.

evet exe dinamik olarak msvcrt.dll(MicroSoftVisualCRunTime) import etmis ve bu dll in strcmp isimli fonksiyonunu? bu bir isaret olabilir mi?

hemen debugger imiza gidip, strcmp i bulup breakpoint atiyoruz. denemeye deger degil mi?

breakpoint i ayarladiktan sonra oynat ugurcum diyoruz ve exe'ye sifre yaziyoruz.



evet arkadaslar, gozlerim yasardi, cunku breakpoint uygulamamizi durdurdu, tam da bekledigimiz gibi strcmp fonksiyonunda durdu(ulan baska breakpoint yok ki zaten, neyse :D)

strcmp in ikinci argumanina dikkat ettigimizde (mov ecx, ss:[esp+8]) ve bu adresi dump ta takip ettigimizde sifrenin bu oldugunu anliyoruz. 

ancak isimiz bitmedi, cunku bu uygulamayi herhangi bir sifre ile acilacak hale getirmeliyiz.
bunun icin strcmp i cagiran kod blogunu bulup, geri donusu kontrol eden yer ile ilgilenmeliyiz.
execute till retun diyoruz ve strcmp tan cikmasi ve crackme icinde strcmp i cagiran kod bloguna gitmesini bekliyoruz.
evet, asil zurnanin ottugu, kuslarin civildadigi bolume geldik,
arkadas strcmp cagrisindan sonra 
test eax, eax
je 40138A
demis,
yani diyor ki, eger strcmp 0 donduyse, 40138A a git ve Passwork Ok yazdir. He yok degilse, normal devam edeceginden Invalid Password yazdir ve sonlan.
eger burdaki je yi jne ye cevirirsek, yani 0 olmadigi durumda ziplatirsak, password korumasini asmis olacagiz, deneyip gorelim
je li satira cift tikladigimizda direk olarak assemble diyalogunu acik kodu editlememize izin veriyor.
burda jz yi jnz ye ceviriyoruz ve menu den Patch File... ya tikliyoruz.
evet diyor ki su adresteki degeri sununla degistiricem (jz ve jnz arasindaki kucuk fark :D)
patch file deyip, crackme0x00.ked.exe olarak kaydediyoruz.

test edelim gorelim.

evet umdugumuz gibi de oldu, sifre tahmin ettigimiz gibi 250382 cikti. ve patchledigimiz uygulama orjinal haline kiyasla yalnizca gercek sifre olan bu sifreyi kabul etmeyip, rastgele yazdigimiz herhangi biseyi kabul ediyor.

hayirli gunler bol reverseler :)


arkadaslar, resimler buyuk oldu, tam cozemedim bu isi, kucuk yapsan okunmaz buyuk yapinca sayfa boka sariyor :| simdilik idare edin, cozecem resim mevzusunu...

programliyoruz fakat neyi?

merhaba arkadaslar,

oncelikle ne diyo lan bu degisik demeden once burdaki amacimi aciklayayim. burada hep birlikte programlama ogrenicez arkadaslar..
yalniz oyle suslu parantez koymalisin modeliyle degil de daha degisik bi yaklasimla ogrenmeye calisicaz. yaklasim modeline isim olarak asagidan yukariya dogru ogrenme bicimi diyebiliriz. hep beraber tecrube edinecegiz zaten yakinda.. haydi baslayalim...

Bilgisayar Nedir?

Bilgisayar verilen girdileri isledikten sonra cikti olarak insanlara(nesnelere de olabilir) sonuc veren-ureten bir alettir.
Aslina bakilirsa dogada bulunan diger unsurlardan cok da farkli degildir.

- Hasan: Bobi Getir oglum!
Bobi dusunur, isler, analiz eder, sonuca varir ve 
- Bobi: Havv haaavvv (git kendin al!)
bobi yine de getirir.

- Hasan: Mahmut abi naptin?
Mahmut abi dusunur, bazen, ve cevap verir,
- Mahmut abi: Iyidir hasan, senden naber?

Asagida da bilgisayarin semasi var, girdi yi aldi isledi ve cikartti.

benim minik bilgisayarim

evet arkadaslar, bilgisayarlarin, doga da ki diger unsurlar gibi etki ye tepki, girdi ye cikti verdiginden bahsetmistik. 
bu anlamda dunyanin en kucuk bilgisayari olan 2 bitlik 2 sayiyi toplayan kucuk bir hesap makinesine bir incelemede bulunalim. 

 (1)
yukaridaki sekil iki bit lik iki ayri sayiyi toplayip yine 2 bitlik (C0 carry out  yani tasma bit i) bir cikti veren makine. sayi sistemleri ile alakali yaziya surdan ulasabilirsiniz..

oncelikle yukarida ki sekiller sekil olarak degil de, konsept olarak cokca karsimiza cikacak, vazgecemeyecegimiz bir cebrin (boolean) kablolu mablolu cizilmis hali. yukaridaki sekli bir fonksiyon grafigi olarak dusunursek, asagida bu fonksiyonun matematiksel ifadesini vericem.

Q0  = A0 XOR B0
Q1  = (A1 XOR B1) XOR (A0 AND B0)
CO = ((A0 AND B0) AND (A1 XOR B1)) OR (A1 AND B1)

boolean matematiginin elektronik izdusumu, kapilar! nedir bu boolean ve kapilar?

boolean cebri, icinde yalnizca dogrular(1, True) ve yanlislarin(0, False) oldugu, bunun haricinde bir sonuca ulasilamayan bir matematik konusudur. Lisede ve/veya universite gordugumuz mantik konusunun aynisi bile diyebiliriz. ki zaten elektronikte kapilara logic gates, yani mantik kapilari denir.(2)

AND:

ancak iki durumda dogru ise dogrudur, yoksa yanlistir.
eger yazi yazmak istiyorsan, en az bir kalem(1) ve bir parca kagit(1) ile bunu yapabilirsin, aksi takdir de(kalemin ve/veya kagidin yoksa) yazamazsin.
INPUTOUTPUT
ABA AND B
000
010
100
111

OR:

herhangi bir durumun dogrulugu, bizim icin yeterlidir.
- bana icecek biseyler lazim?
- kola, su, soda?
- lanet olasi, ne olursa olsun ver, yalnizca icecek olsun!
- here is your acili şalgam (adam gaddar cikti ancak OR kullanmadan once dusunecektin)
INPUTOUTPUT
ABA OR B
000
011
101
111

XOR:

farkli olmak guzeldir diyen xor kapimiz ise, farklilikta sinyal yakarken, ayni fikirlere pek kapali gibi :)
NPUTOUTPUT
ABA XOR B
000
011
101
110

yukarida yazdigimizdan daha fazla kapi mevcut elbet, hepsini yazmiyor, okuyucunun bu metnin yaninda paylastigim gibi referanslardan arastirmasini bekliyorum, ayip mi ediyorum?:)(x)

simdi iki bitlik toplama makinemizin dogrulunu test edelim ne dersiniz?
cok uzatmamak adina yalnizca bir islem yapicam, ornegin makinemize 1 sayisi ile, 2 sayisini toplatalim ve bakalim beklenen gibi 3 sayisini veriyor mu?

1 => 01
2 => 10
3 => 11

beklenen sonuc,
A1  A0        B1  B0   Q1  Q0
 0     1    +     1    0 =   1     1

Q0 = A0 XOR B0 =>
Q0 = 1 XOR 0 =>
Q0 = 1

Q1 = (A1 XOR B1) XOR (A0 AND B0) =>
Q1 = (0 XOR 1) XOR (1 AND 0) =>
Q1 = 1 XOR 0
Q1 = 1

evreka :D

peki ya bilgisayar nasil calisir?

oncelikle bilgisayar dedigimiz aletin en temel birimleri asagidaki resimde gosterilmistir.

ama biz olaylara suanda cok daha soyut baktigimiz icin, bize CPU ve RAM yeterli.
tek kelimeyle CPU nun gorevi, RAM'de ne varsa sirasiyla calistirmak.

CPU bu islemi sirasiyla, RAMden word size i kadar veri cekip(fetch), cektigi bu komutu cozup(decode) ve sonunda cozdugu bu instruction'i calistirarak(execute) yapar.

asagiya basitlestirilmis CPU yapisini atalim, gozler senlensin..

CPU nun kalbi ve karacigeri olarak tasvir edebilecegimiz birimleri ALU (Arithmetic Logic Unit)ve CU(Control Unit).
Bunlardan ALU isminden de anlasilacagi gibi, sayisal ve mantiksal islemleri yapar. Bizim iki bitlik toplama yapan bilgisayarimiz gibi tonlarca aletin bunun icinde oldugunu dusunebiliriz.
CU ise, calisma ile alakali birimdir. bu bahsettigimiz fetch decode zimbirtilariyla bu bolum ilgilenir diyelim, isin icinden siyrilalim :D

Resimde gordugumuz, General Register dedigimiz arkadaslari toplama cikarma falan yaparken kullaniyoruz (elbette baska amaclari da var ancak ne yeri ne zamani)
ornegin 0xA ile 0x10 u toplayacagimizi dusunelim,
once herhangi birini AX e atiyoruz (MOV AX, 0xA)
sonra islemciye onun uzerine digerini eklemesini soyluyoruz (ADD AX, 0x10)
sonuc olarak AX de 1A kaliyor.

internal register diye gecen arkadaslar kodu isletme ile alakali yani bu acidan bunlara CU registerlari da diyebiliriz. *general registerlardan SP de mantik olarak kod isletmeyle alakali aslinda.
bunlardan IP(PC) [Instruction Pointer(Program Counter)] ramden cekilip isletilecek (fetch islemini yapacagi adres, daha sonra burdan okudugu veriyi decode edip, execute edecek diyelim) kodun adresini tutar.

minik bir bilgisayar arasindan sonra gercek bilgisayari aciyoruz!

evet arkadaslar, simdi ise bilgisayara ilk input'umuzu verme zamani geldi. guc tusu!:D
hic kuskusuz bilgisayarin bizden alabilecegi ilk giris acilma zamaninin geldigini soyledigimiz guc tusuna basma olayidir. 
peki ya guc tusuna bastiktan sonra neler olur?

bu konulari diger yazimizda isleyecegiz, cunku deginecegimiz konular biraz uzun ve artik soyutluktan cikip somut seylere gececek. aslinda ben direk baglayip anlatacaktim ancak arkadaslarimin israrina dayanamayip yaziyi boluyorum.

diger yazida; gucu alan bilgisayar ne tepki verir, bios ne nasil ve nerede calisir, kucuk bir real vs protected mode girisi, isletim sistemlerinde bootstrap kodlari ne is yapar,  MBR ve yeni tekno EFI de isler nasil yurur gibi konulara deginecegiz.

hayirli isler, bol kazanclar diliyorum, allaha emanet olun :D

3 Temmuz 2013 Çarşamba

Giris, Gelisme, Sonuc :)

Bu tamamen oylesine olusturulmus bir deneme yazisidir. Bu yaziyi yazarken kafamda olan sey suydu;
acaba sistem calisiyo mu ?
acaba google bu isi yapabilmis mi ?
acaba ben kimim, nerdeyim, niye ? ( bu sorular hep aklimda, blogla alakasi yok :) )
......

neyse, publish tusuna bastigim zaman yukarida yazdigim ve bu yaziyi yazmaya baslarken unuttugum sorularin bi cogunun cevabini alicam :) :)