Mam plik binarny i mam złamać hasło (zadanie domowe). Podano także funkcję (funkcję, która jest częścią pliku binarnego). Ta funkcja pokazała, że łańcuch wejściowy został porównany z prawidłowym hasłem znak po znaku i natychmiast zwrócił fałsz, gdy znak jest zły (to chyba nie jest bezpieczny sposób, ponieważ jest to czas przeciekania i otrzymujemy pomysł na prawidłową długość hasła jako przykład). Ale nasz nauczyciel dodał losowy licznik czasu, który zwraca wynik (poprawny / błędny), aby było nam trochę trudniej ...
W każdym razie udało mi się to już z powodzeniem za pomocą inżynierii wstecznej i otrzymałem prawidłowe hasło. Teraz gram z nim w wierszu poleceń:
/usr/bin/time -v ./program_name enter_password
Dzięki temu poleceniu otrzymuję wiele informacji, takich jak czas systemowy, zamiany, czas wykonania .. Ale najbardziej interesujące są dla mnie „Dobrowolne przełączanie kontekstu”, ponieważ im więcej prawidłowych znaków hasła wprowadzę, tym mniej „Dobrowolne przełączanie kontekstu " Dostaję!
Im więcej błędnych znaków wprowadzę, tym więcej dostaję „Dobrowolnych przełączników kontekstu”.
Złamanie hasła zajęło mi prawie dwie godziny, wpisując to polecenie, wprowadzając znaki i obserwując „Dobrowolne przełączanie kontekstu”. Ilekroć JEDNA postać była poprawna, „Dobrowolne przełączanie kontekstu” zmniejszało się o jeden.
Moje pytanie, czym dokładnie są „Dobrowolne zmiany kontekstu” i dlaczego pomogły mi złamać hasło?
źródło
Odpowiedzi:
Strona podręcznika dla
time
wyjaśnia koncepcję dobrowolnych i mimowolnych przełączników kontekstu:(cytat pochodzi z mojego systemu Debian, linkowana strona podręcznika ma nieco inny tekst)
Oznacza to, że zmiana kontekstu jest dobrowolna, jeśli proces opuszcza procesor, ponieważ nie ma nic innego do roboty (podczas oczekiwania na coś zewnętrznego). Mimowolne, jeśli chce kontynuować obliczenia, ale system operacyjny decyduje, że czas przejść na inny proces.
Jak to wszystko ma związek z programem sprawdzającym hasło, zależy od tego, co program faktycznie robi.
Z kodu źródłowego połączonego w komentarzach widzimy, że program wywołuje
usleep()
jeden raz dla każdego niepasującego znaku, kontynuując pętlę porównawczą dla następnego znaku. Uśpienie jest mniej więcej tak dobrowolne, jak wydajność procesora, dlatego te wywołania będą wyświetlane jako dobrowolne przełączniki kontekstu dla każdej postaci niemechanicznej.W systemie Linux powinieneś także widzieć połączenia
strace
.Ostatnie opóźnienie pochodzi z losowego snu
T * (rand() % 3)
, tj. 0, 1 lub 2 razy stała. To dość zgrubna ziarnistość, więc powinno być łatwo uśrednić, wykonując wiele prób z tym samym hasłem.źródło