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,

Hiç yorum yok:

Yorum Gönder