ADD2V2(4).TXT

(11 KB) Pobierz
--------------------------------
TEMAT: Omowienie nowego typu zabezpieczenia, zadnych nowych instrukcji oraz hit (kit??) jak zmienic wartosc rejestru, postawic lub zdjac flage i zmieniac instrukcje w pamieci??
--------------------------------

-------------------
   WSTEPNIAK
-------------------

hey... witaycie... to jest druga lekcja, ktora dla was pisze.. he.. cieszycie sie co?? Przynajmniej chcialbym zeby tak bylo... pamietajcie, ze zawsze warto jest sie usmiechac i cieszyc bo po co rozpamietywac jakies badziewne historie... no ale troche (a
nawet bardziej) zboczylem z tematu. Ta lekcja bedzie krotka, aczkolwiek tresciwa... wiec chyba nie ma co przeciagac tylko wreszcie zaczac nauke...

-----------------------------
OMOWIENIE TYPU ZABEZPIECZENIA
-----------------------------

Aby otrzymac podstawowe informacje trzeba najpierw uruchomic test_crackme nr 2, wiec zrob to. Widzisz teraz ze masz podac serial, wiec... emm czekaj.. czekaj.. serial?? a co to jest serial?? he.. pamietasz, gdy uruchomiles poprzednie test crackme miales
podac haslo, wiec ja ci objasnie co to jest haslo i co to jest serial a ty wnioski juz chyba wyciagniesz.
Jesli mamy podac haslo to mozemy uzyc dowolnych znakow ktore mozna zastosowac z klawiatury (cyfry, litery, znaki specjalne), np. muSzyn. W hasle mozemy zastosowac kombinacje wszystkich dostepnych znakow np. m1@S{yn+. Teraz obliczmy ile znakow mozemy zast
osowac w hasle. Mamy 26 liter malych i 26 liter duzych, w sumie mamy ich 52. Mamy 10 cyfr (0 do 9), czyli juz mamy 62 znaki do wykorzystania. Do tego dochodza wszystkie znaki specjalne ktorych nie sposob wymieniac bo niektore sa dostepne tylko dla okresl
onych ludzi, np. polacy uzywaja polskich liter typu: �󹜳����, a niemcy juz ich nie uzywaja natomiast uzywaja swoje tam jakies inne. Znakiem specjalnym jest np. "r" w koleczku mowiace o tym ze nazwa danej firmy jest zastrzezona. Mozemy rowniez uzyc (nie
wiem czy te znaki uznane sa jako specjalne czy nie, ja uznalem je jako zwykle wiec jesli zle uznalem to bez zadnego gromami walenia na skrzynke) znakow, `~!@#$%^&*()_+-=<>?,./:";'{}[], ktorych w sumie jest 30. Czyli mamy juz 62 + 30 = 92. Dodajmu do tego
 spacje (bo to tez znak) i mamy juz 93. No wiec wniosek z tego wnioskowania i dodawania taki ze teoretycznie w hasle mozemy wykorzystac 93 znaki + multum znakow specjalnych.
Serial natomiast jest numerem. Jesli program pyta sie ciebie o serial to znaczy ze mozesz uzyc tylko 10 znakow, cyfr od 0 do 9. Nie dozwolone sa litery czy znaki specjalne. Ta informacja jest bardzo istotna chocby przy uzyciu techniki brute force o ktore
j daaalej, w nastepnych lekcjach....
No to jesli wiesz juz czym rozni sie serial od hasla to jedziemy dalej...

-----------------------------
        ZACZYNAMY ;-))
-----------------------------

Teraz juz wiesz ze masz do wykorzystania tylko cyfry, nie mozesz wpisywac zadnych liter.. znaczy mozesz ale po co?? jak wiesz ze serial z litera napewno bedzie blednym serialem.
No to jesli masz uruchomionego test_crackmes'a (Add2v2.exe) to wpisz jakis numerek. Ja wpisalem:
1111
Jesli wpisales to teraz ctrl-d. Powiem ci ze test_crackme lapie sie na GetWindowTextA... pomysl co musisz teraz zrobic.. juz pomyslales?? i co?? nic?? he.. ale nie martw sie, po jakims czasie bedziesz wiedzial co zrobic od razu. Wiec piszemy cos takiego:

bpx GetWindowTextA
Teraz ctrl-d, klikamy "sprawdz ;)" i he.. he.. ladujemy w si (yeah!!!).. klikamy F11 i juz jestesmy w miejscu zaraz po wywolaniu funkcji.. i widzimy takie oto instrukcje:

//uwaga\\
nie mam tendencji do omawiania tych samych rzeczy kilkakrotnie, wiec jesli cos bylo omowione w lekcji poprzedniej nie bedzie omawiane w tej... i analogicznie w lekcjach nastepnych
\\koniec//

015F:004010E2  E885000000          CALL      USER32!GetWindowTextA

Tutaj wywolanie funkcji api na pobranie tekstu. Czasami (jesli programista nie postaral sie aby bylo inaczej) mozemy znalezc adres do ktorego zostalo pobrane to co wpisalismy. Mozemy to sprawdzic w sposob nastepujacy. Musimy przesunac ekran troche do gor
y (ctrl+strzalka_w_gore), tak abysmy widzieli kilka lini nad wywolaniem funkcji. W tym test_crackme mamy cos takiego:
push esi
push edi
push 09
push 0040310C <--- XXX
push dword ptr [004030FB]
CALL      USER32!GetWindowTextA

Te wszystkie push'e sa argumentami funkcji na pobranie tekstu. I tutaj jesli przedostatni argument (oznaczony XXX).. nie jest rejestrem.. to piszemy:

d wartosc_argumentu

czyli dla nas:

d 0040310C

i ukaze nam sie w okienku nasz wpisany serial. Mozesz teraz sie zastanawiac "dlaczego jesli argument jest rejestrem to nie warto go sprawdzac??" Poniewaz poprzez wywolanie funkcji rejestry sa modyfikowane, nie wszystkie oczywiscie. Rejestry ktore nie sa
modyfikowane przez ta funkcje to:

edi, ebx, ebp, esi

Wniosek z tego taki ze powyzszych rejestrow funkcja nie modyfikuje i jesli sa postawione jako argumenty to mozesz potem sprawdzac jakie sa w nich wartosci (adresy) i odpowiedni rejestr (postawiony jako argument) bedzie zawieral twoj serial. Jesli argumen
tem jest rejestr inny niz zademonstrowane wyzej, to nie ma nawet co sprawdzac bo sa one przemielone w szerz i wzdluz. Informacja ta jest sprawdzana metoda prob i bledow i wydaje sie byc prawdziwa. A o zastosowaniu tego ze adres naszego seriala jest argum
entem funkcji, bedzie dalej....

Nastepne instrukcje:
015F:004010E7  33F6                XOR       ESI,ESI
015F:004010E9  33FF                XOR       EDI,EDI

operacja xor na rejestrach esi oraz edi w wyniku czego zerowane sa te rejestry...

015F:004010EB  BEA8304000          MOV       ESI,004030A8
015F:004010F0  BF0C314000          MOV       EDI,0040310C

he.. co my tu mamy... chyba to juz przerabialismy... poprostu sprawdz:

d 004030A8

i co mamy?? Baardzo wiele mowiaca liczbe:

1234

no ale nic lecmy dalej:

d 0040310C

he.. czyzby nasz serial?? tak tu jest nasz serial...

015F:004010F5  8B3F                MOV       EDI,[EDI]

cztery bajty z pod rejestru edi (adres naszego seriala) sa przenoszone bezposrednio do tego rejestru, czyli teraz w edi nie mamy adresu pierwszego bajtu naszego seriala tylko cztery bajty spod tego adresu, a w naszym przypadku jest to caly serial ;-))

015F:004010F7  8B36                MOV       ESI,[ESI]

analogicznie tylko ze z liczba "1234"...

015F:004010F9  3BF7                CMP       ESI,EDI
015F:004010FB  7418                JZ        00401115

ten kawalek (jak rowniez inne) zdazylismy juz poznac.. ale ja go wykorzystam na nowa nauke.. jaka?? otoz jak zmienic wartosc rejestru?? oraz jak ustawic lub nie flage??
Tutaj jezeli po porownaniu cmp flaga Z bedzie ustawiona to skok "jz" sie wykona czyli bez owijania w bawelne jesli porownywane wartosci sa rowne to flaga Z zostaje ustawiona, skok "jz" wykonany i prawdopodobnie otrzymujemy wiadomosc o prawidlowym hasle.
A z kolej jesli w edi siedzi nasz serial a w esi liczba 1234 to co??... he.. wlasnie.. zgadles.. "1234" to prawidlowy serial... he proste nie?? ale nic skupmy sie na zmianie wartosci rejestrow...
Zakladam ze masz teraz podswietlona instrukcje cmp i jesli wiesz ze twoj wpisany serial jest zly to mozesz zastosowac takiego malego patcha... zmienic wartosc rejestru edi na wartosc rejestru esi (lub odwrotnie, ja preferuje sposob zademonstrowany) co po
skutkuje tym, ze flaga Z zostanie ustawiona.. a robi sie to w ten sposob:

r [enter]

wtedy twoj kursor przeniesie sie do okienka rejestrow po ktorym poruszasz sie strzalkami i tab... czyli najezdzasz kursorem na odpowiedni rejestr, ustawiasz kursora w miejscu odpowiednim.. i piszesz (in hex... of course ;-])... gdy juz skonczys naciskasz
 enter'a lub esc (o ile mi wiadomo w wersjach 3.x si po esc zmian nie zapisuje...) i juz mamy zmodyfikowany rejestr i w esi oraz edi jest to samo wiec porownanie wypadnie pomyslnie... no to przejdz do nastepnej instrukcji (F10).. i popatrz na flage Z.. h
e he.. ustawiona prawda?? jesli nie to cos pokreciles... powinna byc ustawiona... no ale nic teraz masz ustawiona flage Z i co nie ladna taka ustawiona.. hmm.. no ta ja zdejmiemy...

r [enter]

i najezdzamy kursorem na ta flage i klawiszem:

insert

ja zdejmujemy.. kolejne zas nacisniecie tego klawisza spowoduje jej postawienie.. ale my zostawimy ja jako zdjeta... i potwierdzamy to enterem (bo esc nie zapisuje zmian w rejestrach flagowych)....
No ale co.. teraz skok sie nie wykona a my chcemy zeby sie wykonal no to mozemy:
- postawic flage,
- wyjsc z si i wpisac poprawny serial,
- wyjsc z si i zaczynajac wszystko od poczatku dojsc do porownania a nastepnie zmodyfikowac rejestr
- zmienic instrukcje jz na przeciwna?? i tym samym nauczyc sie czegos nowego..

ja wybralem ostatnia mozliwosc... otoz mozemy rowniez zmienic instrukcje w pamieci (si gora.. oh yeah!!)... a umozliwia nam to malutki kompilator wbudowany w si oraz komenda:

a [enter]

jezeli mamy instrukcje do zmiany aktualnie podswietlona to wystarczy ze wpiszemy

a

potwierdzimy enter'em i juz mamy po lewej stronie adres pod ktorym bedziemy modyfikowac i kursor czekajacy na komende. Czasami jest tak ze instrukcja do zmiany byla juz wczesniej albo dopiero bedzie, to wtedy uzywamy takiej oto skladni:

a adres_instrukcji_do_zmiany [enter]

czyli dla naszego:

015F:004010FB  7418                JZ        00401115

komenda bedzie miala taka postac:

a 004010FB [enter]

i juz mozemy zmieniac na instrukcje przeciwna, a jest nia "jnz", czyli w skrocie robimy tak:

a adres
dla nas:
a 004010FB

i wpisujemy instrukcje, dla nas:

jnz 00401115

potwierdzamy dwukrotnie enterem (esc nie zapisze zmian).. i juz widzimy ze instrukcja sie zmienila i skok sie wykona.. wiec jest ok..

//Tips\\

Mozesz zmieniac instrukcje oryginalna na jaka tylko tylko ci sie wymarzy.. pamietaj jednak przy zmianach takiego typu jak zademonstrowalem zawsze zachowuj oryginalne adresy skokow, no chyb...
Zgłoś jeśli naruszono regulamin