KeyGenMe - zabawa edukacyjna ;)

eXxyL

Użytkownik
Dołączył
Styczeń 25, 2006
Posty
12
Witam!

Napisalem prosty keygenme, aby zachecic ludzi z forum do RE
smile.gif


Reguly:
1. Nalezy napisac keygen'a
smile.gif


Zasady:
1. Patch'owanie jest zabronione.

Opis:
Prosty algo, brak anty-dbg, brak crypto, napisany w c++, idealny crackme dla poczatkujacych.

Kod zrodlowy crackme(bez algo):
Kod:
#include <cstdlib>

#include <iostream>

#include <cmath>



using namespace std;

int main()

{

   double name;

   double serial;

   double bad;

   

   cout 

        << "KeyGenMe! #1 by eXxyL" <<endl

        << "Level: 1/10" << endl 

        << "Crackme napisany w C++" << endl

        <<endl;

    printf("Podaj liczbe:n");

    scanf("%lf", &name);

    if(name > 10000)

            {

                    printf("Liczba musi byc mniejsza od 10000!!!nn");

                    system("PAUSE");

                    return 0;

            }

    else if(name < 4.4)

            {

                  printf("Liczba musi byc wieksza od 4.3!!!nn");

                  system("PAUSE");

                  return 0;

            }

    else

            {

    printf("Podaj klucz:nn");

    scanf("%lf", &bad);

    serial =xxxxxxxxxxxxxxxxxxxxxxxxx;

                if( bad == serial)

                {

                         printf("Dobra robota :) Napisz teraz keygen'a :)nn");

                }

                         

                else

                {

                    

                         printf("Zle :(nn");

                }

       system("PAUSE");

    

    return 0;

           }                 

}

DOWNLOAD

PS: Nie piszcie poprawnego algo na forum(tylko gotowe keygeny)
smile.gif
, za tydzien dam kod zrodlowy keygena



KeyGen(narazie bez algo):
Kod:
#include <stdio.h>

#include <stdlib.h>

#include <math.h>



int main()

{

    double liczba;

    double licz;

    

    printf("KeyGen by eXxyL for KeyGenMe #1 by eXxyLnnn");

    printf("Podaj liczben");

    scanf("%lf", &liczba);

    if (liczba > 10000)

    {

               printf("Liczba musi byc mniejsza od 10000!!nn");

               system("PAUSE");

               return 0;

    }

    else if (liczba < 4.3)

    {

               printf("Liczba musi byc wieksza od 4.3!!!nn");

               system("PAUSE");

               return 0;

    }

    else

    {



               

    licz =  xxxxxxxxxxxxxxxxxxxxxxxxxxxx;

    printf("Poprawna Liczba: %.0f nn", licz);

    

    

    

    

    system("PAUSE");

return 0;

}

}
DOWNLOAD
 

fl3a

Użytkownik
Dołączył
Marzec 12, 2005
Posty
538
Cos nowego i godnego uwagi
smile.gif
Juz dawno powinien sie pojawic taki temat! Kiedys dyskutowalismy o czyms podobnym ale na tym sie skonczylo. Milo by bylo gdyby kilka osob wlaczylo sie aktywnie do zabawy. Tu www.cracklab.ru znajdziecie potrzebne narzedzie.
 

d3vil

Były Moderator
Dołączył
Lipiec 25, 2005
Posty
495
Zobacze to, ale znając moje umiejętności RE to pewnie za dużo z tego nie wyjdzie.
 

M1ch00

Użytkownik
Dołączył
Sierpień 22, 2006
Posty
609
Właśnie obejrzałem i muszę przyznać, że bardzo łatwe, dla początkujących w sam raz. I jak patrzyłem w googlach to nawet nieznajomość instrukcji koprocesora nie powinna być przeszkodą.
 

M1ch00

Użytkownik
Dołączył
Sierpień 22, 2006
Posty
609
Mo4x, twój kgen jest chyba niepoprawny:
Kod:
scanf("%lf", &name);
Natomiast ty czytasz tylko całkowite.

eXxyL, coś się sypie czasami przy nazwach ułamkowych mniejszych od 4.4, jedne są traktowane jakby były zaokrąglone, inne nie mają żadnej sensownej wartości.
 

Mo4x

Były Moderator
Dołączył
Grudzień 26, 2005
Posty
704
Originally posted by M1ch00
Mo4x, twój kgen jest chyba niepoprawny:
Kod:
scanf("%lf", &name);
Natomiast ty czytasz tylko całkowite.
Już poprawiłem.

Originally posted by M1ch00
eXxyL, coś się sypie czasami przy nazwach ułamkowych mniejszych od 4.4, jedne są traktowane jakby były zaokrąglone, inne nie mają żadnej sensownej wartości.
No racja:
crash435rm4.png


eXxyL może byś zrobił, że tylko całkowite? Nie było by takich problemów.
Coś musisz pomyśleć nad tym.
 

M1ch00

Użytkownik
Dołączył
Sierpień 22, 2006
Posty
609
Podejrzewam, że błąd leży w operacjach zmiennoprzecinkowych - wczytywana jest zmienna o rozmiarze 8bajtów, ale rejestry koprocesora na których wykonywane są operacje są 12 bajtowe. I dlatego niektóre wartości się nieznacznie różnią. (Tylko, że tam jest kod który temu zapobiec powinien...)

Mo4x, to chodziło o to chyba, że mało kto zna instrukcje koprocesora. I dlatego double.

Btw - zrobienie z programu keygena - 8 bajtów różnicy
<


//Ech, nikt nawet nie zauważył, że się w rozmiarze double kopnęłem.
 

Mo4x

Były Moderator
Dołączył
Grudzień 26, 2005
Posty
704
Originally posted by M1ch00
mało kto zna instrukcje koprocesora.
Znaczenia tych instrukcji idzie się domyślić :-o

Kod:
FMULP -> MUL -> MULTIPLY -> MNOŻENIE.

FSUBP -> SUB -> SUBSTRACT -> ODEJMOWANIE.

...i tak dalej...

No ludziska minął tydzień, pisać keygenki, pisać :pPP
 

M1ch00

Użytkownik
Dołączył
Sierpień 22, 2006
Posty
609
Oczywiście, że się da. Ale ważne jest też działanie rejestrów koprocesora, pojecie o tym, że instrukcje z "p" na końcu dają wynik w miejsce st, a nie "nad" st, etc.

Niestety szansa, że ktoś jeszcze zrobi to (i następne) zadanko jest mała...

Mo4x, taki mały bonus - może zastanów się jak przerobić oryginał do wypisywania klucza.
 

Mo4x

Były Moderator
Dołączył
Grudzień 26, 2005
Posty
704
Myślę, że tutorial można opublikować, czas na rozwiązanie keygenme minął...
Tutorial w *.swf
Tutorial spakowany w *.zip

Originally posted by M1ch00
Mo4x, taki mały bonus - może zastanów się jak przerobić oryginał do wypisywania klucza.
Tam gdzie crackme wylicza klucz trzeba wstawić/nadpisać kod, który wyświetli ten obliczony serial.

-> Pobieramy liczbę.
-> Pobieramy klucz.
-> Obliczamy klucz.
x <- no i gdzieś tutaj bym wstawił ten kod, który wyświetli obliczony klucz.
-> Porównujemy wpisany klucz z prawidłowym.
-> itd.[/b]
 

M1ch00

Użytkownik
Dołączył
Sierpień 22, 2006
Posty
609
Znasz trochę asma, postaraj się to zrobić w minimalnej liczbie bajtów.
<
Ja potrzebowałem 8, nie mam pomysłu na mniej (6+2) I żeby program się nie sypał od tego...
 

Mo4x

Były Moderator
Dołączył
Grudzień 26, 2005
Posty
704
Originally posted by M1ch00
Znasz trochę asma, postaraj się to zrobić w minimalnej liczbie bajtów.
<
Ja potrzebowałem 8, nie mam pomysłu na mniej (6+2) I żeby program się nie sypał od tego...
Moje zmienianie instrukcji kończyło się na nopowaniu i zamienianiu skoków... :wink:
Teoretycznie wiem, że trzeba zamienić bajty, ale w praktyce już trudniej :) .Chciałbym się dowiedzieć w jaki sposób wyświetliłeś wykalkulowany klucz?
Wkleiłeś funkcje printf() tam czy jak? :pPP
 

M1ch00

Użytkownik
Dołączył
Sierpień 22, 2006
Posty
609
W programie po wyliczeniu keykodu wyświetlany jest komunikat "Zle :(nn" za pomocą printf. Funkcja ta jest o tyle niebezpieczna, że jako pierwszy argument dostaje wskaźnik do ciągu formatującego, a następnie zdejmuje ze stosu kolejne wartości według tego ciągu, bez kontroli. Nadpisując ciąg formatujacy zdejmiemy kolejne bajty leżące na stosie.

Przed wywołaniem printf nie jest używany push, a jedynie wskaźnik jest kopiowany do zmiennej lokalnej.
Kod:
mov     [esp+38h+var_38], offset aZle
Patrzymy na zmienne lokalne:
Kod:
var_38= dword ptr -38h

var_34= qword ptr -34h

var_24= dword ptr -24h

var_1C= dword ptr -1Ch

var_18= dword ptr -18h

var_10= qword ptr -10h

var_8= qword ptr -8
Wynika z tego, że wpisanie %lf pobierze ze stosu kolejne 8 bajtów z [esp+4].

Tyle, że to spowoduje wyświetlenie:
Kod:
lea     eax, [ebp+var_18]

mov     [esp+38h+var_34], eax

mov     [esp+38h+var_38], offset aLf; "%lf"

call    scanf
Czyli podanego, a nie obliczonego klucza. Musimy jakoś pod tym adresem umieścić wartość obliczoną.
Kod:
fsubp   st(1), st;koniec liczenia

fstp    [ebp+var_10];3 bajty - zdjęcie wartości ze stosu pod ebp+var_10

fld     [ebp+var_18];2*3 bajty - załadowanie 2 wartości

fld     [ebp+var_10]

fxch    st(1);zamiana 

fucompp;porównanie
Natomiast
Kod:
fstp    [esp+38h+var_34]
Zajmuje 4 bajty - trzeba zanopować resztę. W efekcie mam:
Kod:
fsubp   st(1), st

fstp    [esp+38h+var_34]

nop

nop

fld     [ebp+var_10]

fxch    st(1)

fucompp
Porównanie zawsze będzie fałszywe, więc nie musze się o nic więcej martwić.
Kod:
KeyGenMe! #1 by eXxyL

Level: 1/10

Crackme napisany w C++



Podaj liczbe:

12.1

Podaj klucz:



0

14451012.000000 :(



Aby kontynuować, naciśnij dowolny klawisz . . .
W sumie zmienione 6 bajtów instrukcji + 2 bajty danych.
Jest to rozwiązanie minimalne, aby było "ładne" można zanopować czytanie klucza.


//Ale się rozpisałem.
 

Mo4x

Były Moderator
Dołączył
Grudzień 26, 2005
Posty
704
Już rozumiem. Dzięki, że Ci się chciało tyle pisać.
Na pewno wiele osób z tego skorzysta i się coś nauczy.
 
Do góry Bottom