i need intrepret this code - for me.... is unredable

0
public class Main
{
	    public static void main(String a[])
    {
        //String b = a[];
        System.out.println(a(b) ? "Authorized" : "Unauthorized");
    }

    private static boolean a(String b)
    {
        
            char c[] = b.toCharArray();
            return c[0] == 'N' && c[5] < 'b' && c[6] == c[0] - 3 && c[10] == c[6] + (c[11] / 11) * 3 && c[7] == c[4] + 1 && c[1] == c[0] + 27 && c[2] > c[1] + 1 && c[3] == c[1] && c[4] == c[1] + (c[0] - 1) / 7 && c[5] > '`' && c[8] == c[7] - 3 && c[9] == c[4] && c[11] > c[0] + 31;
        
    }
}
5

Wrzuć to do z3 albo dowolnego innego constraint solvera i ci policzy. Wygląda jak jakiś warmup challenge z CTFa.
Można by to pewnie nawet rozpisać na kartce jak komuś się strasznie nudzi.

import z3


def main():
    s = z3.Solver()
    c = [z3.BitVec(str(i), 8) for i in range(12)]
    s.add(c[0] == ord('N'))
    s.add(c[5] < ord('b'))
    s.add(c[6] == c[0] - 3)
    s.add(c[10] == c[6] + (c[11] / 11) * 3)
    s.add(c[7] == c[4] + 1)
    s.add(c[1] == c[0] + 27)
    s.add(c[2] > c[1] + 1)
    s.add(c[3] == c[1])
    s.add(c[4] == c[1] + (c[0] - 1) / 7)
    s.add(c[5] > ord('`'))
    s.add(c[8] == c[7] - 3)
    s.add(c[9] == c[4])
    s.add(c[11] > c[0] + 31)
    print(s.check())
    print(s.model())
    print(''.join([chr(s.model()[x].as_long()) for x in c]))
    pass


main()

NikitaKurtin

0

@Shalom: dzięki za rozpisanie ale to mam odpalić w javie sory ale kod wyglada na python ... w javie to sie kompiluje >?

3

Co? o_O Kod w javie który pokazałeś weryfikuje podane hasło, nic więcej. Odpalenie go to kwestia skompilowania. To co ja ci tu podałem to sposób na rozwiązanie tego zadania, czyli na złamanie hasła bazując na tym jak podany kod je weryfikuje. Wyobraź sobie że kod który podałeś to jest weryfikacja klucza do instalacji jakiegoś programu a tu co ja podałem to keygen.

0

XD

0

Klasa main się nie skompiluje, bo brakuje zmiennej b.

to: return c[0] == 'N' && c[5] < 'b' && c[6] == c[0] - 3 && c[10] == c[6] + (c[11] / 11) * 3 && c[7] == c[4] + 1 && c[1] == c[0] + 27 && c[2] > c[1] + 1 && c[3] == c[1] && c[4] == c[1] + (c[0] - 1) / 7 && c[5] > '' && c[8] == c[7] - 3 && c[9] == c[4] && c[11] > c[0] + 31;

Patrząc na oko powinno się skompilować. Przecież to tylko parę warunków połączonych &&

0

i jak udalo Ci sie skompilowac i uzyskac rozwiazanie?

0

o_O Ale jaki wy macie problem z kompilacją tutaj?

public class Main
{
	    public static void main(String args[])
    {
        String b = args[0];
        System.out.println(a(b) ? "Authorized" : "Unauthorized");
    }

    private static boolean a(String b)
    {
        
            char c[] = b.toCharArray();
            return c[0] == 'N' && c[5] < 'b' && c[6] == c[0] - 3 && c[10] == c[6] + (c[11] / 11) * 3 && c[7] == c[4] + 1 && c[1] == c[0] + 27 && c[2] > c[1] + 1 && c[3] == c[1] && c[4] == c[1] + (c[0] - 1) / 7 && c[5] > '`' && c[8] == c[7] - 3 && c[9] == c[4] && c[11] > c[0] + 31;
        
    }
}

I już, teraz skompilowany program będzie weryfikować hasło podane jako argument wywołania.
Nadal wydaje mi się że zupełnie nie zrozumieliście celu tego zadania. To nie skompilowanie kodu miało być trudnością xD

0

Plik wyglada tak : spakowałem 7z bo nie chciał dołączyć .class rozszerzenia
Zadanie polega na znalezieniu w tym pliku informacji o loginie uzytkownika

Auth.7z

3

No to przecież napisałem wam już na samym początku. Plik zawiera logikę walidacji loginu użytkownika i można za pomocą constraint solvera wywnioskować jaki poprawny login przejdzie taką walidacje. Wrzucasz co do z3 albo dowolnego innego solvera i dostajesz ze poprawny login to NikitaKurtin

Oj obawiam się panowie że security to chyba jednak nie dla was :)

0

@Shalom: dzięki ale proszę o pomoc bo wrzucałem to do online-java.com niżej kod kompilatora i wychodził błąd w kompilacji ? i nie wiem dlaczego. co to znaczy wrzucasz do z3 co to jest z3 ?
dzięki za odp z góry

Main.java:20: error: cannot find symbol
        final String b = a[0];
                         ^
  symbol:   variable a
  location: class Main
1 error


** Process exited - Return Code: 1 **
0

Ja nadal nie rozumiem co ty próbujesz zrobić i po co. Po co chcesz ten zdekompilowany kod znów kompilować? Masz piłk .class który normalnie możesz sobie uruchomić przecież?

Kod jest obfuskowany i nazwy symboli są zepsute, dlatego ci się nie kompilluje. Podałem wyżej zmieniony kod który się kompiluje jak zmienisz nazwę tablicy argumentów wywołania z a na jakieś args żeby nie kolidowała z funkcją o nazwie a. Tylko nadal nie rozumiem po co ci to niby jest skoro masz już skompilowany plik .class

z3 to smt solver. Taka magia której możesz podać pewne ograniczenia a ona zwróci ci wartość która je spełnia.

Program który podałeś zawiera jedynie logikę walidacji loginu, nic więcej. Tak jakbym powiedział ci że moja sekretna liczba jest mniejsza od 10 i dzieli się przez 2 i przez 3. Umiesz na tej podstawie stwierdzić jaka to liczba?

0
public class Main
{
	    public static void main(String a[])
    {
        String pass = a[0];
        System.out.println(a(pass) ? "Authorized" : "Unauthorized");
    }

    private static boolean a(String b)
    {
        
            char c[] = b.toCharArray();
            return c[0] == 'N' && c[5] < 'b' && c[6] == c[0] - 3 && c[10] == c[6] + (c[11] / 11) * 3 && c[7] == c[4] + 1 && c[1] == c[0] + 27 && c[2] > c[1] + 1 && c[3] == c[1] && c[4] == c[1] + (c[0] - 1) / 7 && c[5] > '`' && c[8] == c[7] - 3 && c[9] == c[4] && c[11] > c[0] + 31;
        
    }
}

O to chodziło?

0

Ok zajarzyłem teraz ..... pozdrawiam dzięki ALL za poradę

1 użytkowników online, w tym zalogowanych: 0, gości: 1