Skocz do zawartości

HackMe 3.0 (było)


Gość

Rekomendowane odpowiedzi

Witam :) Wiem, że był temat o HackMe 3.0, ale nie chciałem go odświeżać. Zatrzymałem się na 12 levelu. Oblookałem ten kod źródłowy, sprawdziłem w Internecie jak działają zawarte tam funkcje, ale nadal nie mogę rozszyfrować tego hasła :/ Mógłby mi ktoś go podać? :)

Z góry thx :)

Odnośnik do komentarza
Udostępnij na innych stronach

<script>
code=eval(unescape("%66%75%6E%63%74%69%6F%6E%20%78%28%63%6F%29%7B%20%72%65%74%75%72%6E%20%63%6F%2A%63%6F%2A%63%6F%2D%31%3B%20%7D"));
pobierz=prompt('Podaj haslo do levelu 12:','');
id=2;q=2+8-4+9-9+1-1+2+3+4+5+6+7+8+9*7*0;
if (pobierz.indexOf("am")!=-1) { id=(2+2)*2; }
if (pobierz.indexOf("pm")!=-1) { id=2+2*2; }
liczba=x(3)*3+7;
tmp=x(id)*x(id)*x(id);
liczba=unescape("%"+liczba.toString(16));
if (pobierz.length>3)
q=pobierz.substring(3,4);/*
if (q<8) {q=12} else {q=3}
*/
if ((pobierz.length>3) && (pobierz.indexOf(liczba)==0) && (tmp==9938375) && (id==q) && (pobierz.length<5)) {
alert('Udalo sie');
self.location.href=x(3)+'z'+pobierz+'.php';
} else {alert('Złe haslo');}
</script>

Przeanalizujmy:

if ((pobierz.length>3) && (pobierz.indexOf(liczba)==0) && (tmp==9938375) && (id==q) && (pobierz.length<5)) {

zmienna pobierz ( czyli podane hasło ) musi mieć 4 znaki ( długość większa od 3 i mniejsza od 5 ). Wiemy już ile znaków ma nasze hasło :)

pobierz.indexOf(liczba)==0

Na początku hasła musi znajdować się wartość zmiennej liczba

Tmp nas nie interesuje, bo akurat są tylko dwie możliwości hasła

id==q

q ma się równać id. Q jest ostatnim znakiem hasła ( linijka q=pobierz.substring(3,4); )

 

Mamy już większość, co powinniśmy wiedzieć o tym haśle. 4-znakowe, na początku wartość jednej zmiennej na końcu wartość drugiej zmiennej.

 

if (pobierz.indexOf("am")!=-1) { id=(2+2)*2; }
if (pobierz.indexOf("pm")!=-1) { id=2+2*2; }

Te dwie linijki mówią nam o wartości id przy dwóch przypadkach: gdy w haśle będzie się znajdować "am" ( id=8 ), lub "pm" ( id=6 ). Znamy więc 3 znaki hasła ( *am8 lub *pm6 ).

 

Zajmijmy się więc pierwszym znakiem:

Odkodowując pierwszą linijkę otrzymujemy funkcję

function x(co){ return co*co*co-1; };

liczba=x(3)*3+7;
[...]
liczba=unescape("%"+liczba.toString(16));

 

Obliczamy, że (3*3*3-1)*3+7 jest równe 85 co w systemie szestnastkowym ( toString(16) ) daje nam 55. Odkodowując %55 otrzymujemy duże U.

 

Tak więc mamy dwie możliwości: Uam8 lub Upm6. Obliczając prawidłowe tmp możemy określić tylko jeden wynik ale po co, gdy możemy po prostu sprawdzić te dwie możliwości? I tak zajmie nam to krócej niż liczenie zmiennej tmp :P

 

 

 

 

13 poziom zajął mi niecałą minutę, uwierz naprawdę jest prosty. Przy 14 poziomie musisz napisać własny skrypt logowania ;)

 

EDIT: Wkradł się mały błędzik z hasłem :P Poprawiłem

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...