ninja crackme by bart/xt vide themoron/DNX.INC
ninja crackme by bart/xt vide themoron/DNX.INC
29 Wrzesnia 2oo1 @ 23:23
d:)
Zasiegnalem jezyka na #crackpl (hi eax ;), a na #crackpl jak zawsze - - nikt nic nie wie :). Tak zachecony postanowilem sie na ninje wziasc d:). Coz widac po odpaleniu, boo nic ciekawego, dopiero w About mozemy nacieszyc wzrok pieknym, tryskajacym barwami i jakze interesujacym w swej tresci
obrazkiem d:). Autor tegoz obrazka zasluguje na szczegolne uznanie, albowiem logosa takiej pieknosci oczy ludzkie dlugo jeszcze ogladac nie beda (uklon dla tworcy). Nie na oprawie graficznej, jeno na zabezpieczeniu uwage skupic nalezy, gdyz jak w .dizie zostalo napisane, ninja w algo RSA zaopatrzony przez swego Ojca zostal ("Et veni Creator Spiritus" d:-). RSA ostatnimi czasy bardzo popularnym sie stal wsrod programistycznej gawiedzi. "Ach dlaczego mily przyjacielu?" - zapewne zapytasz. Odpowiedz jest arcyprosta - cracker bydle plugawe skeygenowac proga nie moze, jesli n odpowiednio duzo bitow zajmowac bedzie, amen. "Ach, przyjacielu, czymze jest owo 'n' o ktorym z takim zapalem
prawisz?". W prostych slowach wytlumaczyc tego nijak nie idzie d:(. Jeslis jednak zadny wiedzy, looknij pod http://zencrack2.cjb.net/Miscpapers.htm#rsa a Twoj glod poznania zostanie zaspokojny (btw, przeczytaj jak chcesz zajarzyc ten tut d:). Tak wiec moj bracie najmilszy, rozpocznijmy zabawe, bo to o nia przeciez przy lamaniu sie rozchodzi d:).
Zacznijmy od miejsca, w ktorym wszystko sie zaczyna - od poczatku... d:). Po 2 wywolaniach szacowanej api GetDlgItemTextA, na stos wedruja kolejno pulic exponet (e=1001h), modulus n (ASCII), serial i name. Zaraz potem wywolana zostaje jakas funkcja blizej naszemu umyslowi nie znana. Domyslac sie tylko mozna ze jest to procka sprawdzajaca poprawnosc wpisanego kodu. Coz widzimy dalej? Rejestr EAX porownywany zostaje z jakas wartoscia i jesli nie jest jej rowny to z czelusci kodu wylania sie string "Invalid...". Zaprawde, ciekawa to sprawa... dedukcji swej uzywajac kazdy do wniosku dojdzie, ze procka w ktorej sprawdzanie sie odbywa, ma wlasny "system" zwracanych wartosci np. jesli imie nasze zawiera jakies niedozwolone znaki to zwrocona jest wartosc X, jesli jest zbyt dlugie, wartosc Y etc. Dosc juz domyslow, sama dedukcja seriala wyciagnac nie sposob, Bog milosciwy chcialby zapewne, aby looknac w procke sprawdzajaca... Przedtem jednak uprzedzic nieostroznych nalezy, aby nie zapuszczali sie w kazdy call jaki na swej drodze spotkaja. Roztropnym trzeba byc niczym gajowy, ktory tropi klusownika - nie laz po calym lesie liczac ze trafisz na lotra kiedy bedzie wyproznial sie w krzakach. Szukaj sladow, nasluchuj wystrzalow, odwiedzaj miejsca gdzie najczesciej przebywa zwierzyna, a wtedy szanse na zlapanie klusownika wzrosna. A! i najwazniejsze - musisz dobrze znac swoj las d:) Zaprawde dosc juz rad, looknijmy w procke. Na sam przod name przechodzi konwersje na DUZE litery, co jest dla mnie colkowicie niezrozumiale... widac imc themoron mial taki kaprys. Z name ku zaskoczeniu wszystkich, liczony jest hash, ktory jak sie potem okaze, odgrywa znaczaca role, ale cii, nie uprzedzajmy fucktow d:). Majac na uwadze wczesniesze przestrogi, nie zaglebiamy sie w kolejne calle, badamy tylko podawane argumenty. Wiedzac ze crackme naklepane zostalo w C, ciezko bowiem zaimplementowac RSA w asm, dochodzimy do wniosku, ze te parszywe calle maja zwiazek z systemem miracl d:). Najpierw inicjowany jest sam system, potem zmienne, a na koniec baza liczbowa. Kazdemu zalecam arcydokladnie zapoznac sie z wygladem tych procedur pod debugerem, wiedza jak powszechnie wiadomo procentuje d:). Gdy caly ten z piekla rodem kod wykonany zostanie, hash na format BIG jest konwertowany przy pomocy bytes_to_big(_MIPT_ int,char *,big);. Nastepnie n i e ta sama meczarnie przechodza, tym razem jednak przy uzyciu innej funkcji -
cinstr(_MIPT_ flash,char *);. cinstr poniewaz n i e w formie stringu (ASCII) sa zapisane. Coz tedy dzieje sie z serialem? Przechodzi ta sama droge ASCII->BIG, ze wzgledu na jego przeznaczenie. Mianowicie przekonwertowany kod jest SZYFROWANY! Gdy jego przeznaczenie sie spelni, nadchodzi czas proby -
porownanie. W tej jakze donioslej chwili porownywane sa: ZASZYFROWANY serial i... hash z name (compare(big,big);)! Zapisujac to w formie rownania otrzymamy:
MD5(name) == RSA_ENCRYPT(serial)
Jak policzyc serial, aby wszystko bylo jak nalezy? Bzzzzzzzzzzz, mam!
SERIAL == RSA_DECRYPT(MD5(name))
Jesli "odszyfrujemy" hash MD5 z name otrzymamy serial, bo przeciez zaszyfrowany serial == hash!
Do RSA_DECRYPT niezbedny jest d. Niestety, mimo szczerych staran i kilku dni pracy kompa non-stop, policzyc mi sie nie udalo :(. Jesli masz dostep do jakiegos szybkiego srvka - mozesz sprobowac sam,
powodzenia!
PS
Azalisci druhu, nie mam pojecia skad tez ten sredniowieczny styl zawital u bram mojego umyslu. Faktem jest jednak ze tut pokrasnial od tego w sposob zdecydowany!
Ged_^crackpl
- Zaloguj się lub zarejestruj by odpowiadać