Я получил бинарный файл и должен взломать его пароль (домашнее задание). Была также задана функция (функция, которая является частью двоичного файла). Эта функция показала, что входная строка сравнивалась с правильным паролем символ за символом и сразу возвращала ложь, когда символ был неправильным (это небезопасный способ сделать это, я полагаю, потому что сейчас время утечки, и мы получаем представление о правильной длине пароля как пример). Но наш учитель добавил случайный таймер, который возвращает результат (правильный / неправильный), чтобы сделать его немного сложнее для нас ...
Во всяком случае, я уже сделал это успешно с помощью обратного инжиниринга и получил правильный пароль. Сейчас я играю с этим в командной строке:
/usr/bin/time -v ./program_name enter_password
С помощью этой команды я получаю много информации, такой как системное время, перестановки, время выполнения. Но что меня больше всего интересует, так это «Добровольные переключения контекста», потому что чем больше правильных символов введенного мной пароля, тем меньше «Добровольные переключения контекста» " Я получил!
Чем больше неправильных символов я ввожу, тем больше я получаю «добровольных переключений контекста».
Мне понадобилось почти два часа, чтобы взломать пароль, просто введя эту команду, введя символы и наблюдая «Добровольные переключения контекста». Всякий раз, когда ОДИН символ был правильным, «Добровольное переключение контекста» уменьшалось на единицу.
Мой вопрос, что такое «добровольное переключение контекста» и почему они помогли мне взломать пароль?
источник
Ответы:
Страница man для
time
объяснения концепции произвольных и непроизвольных переключений контекста:(цитата из моей системы Debian, ссылка на справочную страницу имеет немного другой текст)
То есть переключение контекста является добровольным, если процесс покидает ЦП, потому что ему больше нечего делать (в ожидании чего-то внешнего). Непроизвольно, если он хотел бы продолжить некоторые вычисления, но ОС решает, что пришло время переключиться на какой-то другой процесс.
То, как все это связано с программой проверки паролей, зависит от того, что на самом деле делает программа.
Из исходного кода, связанного в комментариях, мы видим, что программа вызывает
usleep()
один раз для каждого несоответствующего символа, после чего продолжая цикл сравнения для следующего символа. Спящий режим является настолько же добровольным, как и выход процессора, так что эти вызовы будут отображаться как произвольные переключения контекста для каждого не обрабатывающего символа.В Linux вы также должны видеть вызовы с помощью
strace
.Окончательная задержка происходит из-за рандомизированного сна
T * (rand() % 3)
, то есть 0, 1 или 2 раза больше постоянной. Это довольно грубая детализация, поэтому ее легко усреднить, выполнив несколько попыток с одним и тем же паролем.источник