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