Что такое «Добровольное переключение контекста»?

34

Я получил бинарный файл и должен взломать его пароль (домашнее задание). Была также задана функция (функция, которая является частью двоичного файла). Эта функция показала, что входная строка сравнивалась с правильным паролем символ за символом и сразу возвращала ложь, когда символ был неправильным (это небезопасный способ сделать это, я полагаю, потому что сейчас время утечки, и мы получаем представление о правильной длине пароля как пример). Но наш учитель добавил случайный таймер, который возвращает результат (правильный / неправильный), чтобы сделать его немного сложнее для нас ...

Во всяком случае, я уже сделал это успешно с помощью обратного инжиниринга и получил правильный пароль. Сейчас я играю с этим в командной строке:

/usr/bin/time -v ./program_name enter_password

С помощью этой команды я получаю много информации, такой как системное время, перестановки, время выполнения. Но что меня больше всего интересует, так это «Добровольные переключения контекста», потому что чем больше правильных символов введенного мной пароля, тем меньше «Добровольные переключения контекста» " Я получил!

Чем больше неправильных символов я ввожу, тем больше я получаю «добровольных переключений контекста».

Мне понадобилось почти два часа, чтобы взломать пароль, просто введя эту команду, введя символы и наблюдая «Добровольные переключения контекста». Всякий раз, когда ОДИН символ был правильным, «Добровольное переключение контекста» уменьшалось на единицу.

Мой вопрос, что такое «добровольное переключение контекста» и почему они помогли мне взломать пароль?

cnmesr
источник
5
Поздравляем с открытием для себя богатой и до сих пор не совсем понятной области атак по побочным каналам .
Звол
1
@zwol Что вы подразумеваете под "богатым"? И, кроме того, в настоящее время мы имеем дело с побочными атаками в классе, извините, что я не совсем «полностью понял» его поле так быстро…
cnmesr
15
@cnmesr Я воспринял это как искренний, а не саркастический комментарий, говоря, что zwol считает поле интересным, поскольку новые открытия все еще делаются. Дело не в том, что вы до конца не поняли, а в том, что никто не понимает этого полностью, и это делает его интересным.
августа
3
@hvd cnmesr Да, это то, что я имел в виду.
Звол
@zwol Ой, прости! Я неверно истолковал вас и увидел в этом атаку: p
cnmesr

Ответы:

36

Страница man дляtime объяснения концепции произвольных и непроизвольных переключений контекста:

The resource specifiers [...] are:
   c      Number of times the process was context-switched involuntarily
          (because the time slice expired).
   w      Number of times that the program was context-switched voluntarily, 
          for instance while waiting for an I/O operation to complete.

(цитата из моей системы Debian, ссылка на справочную страницу имеет немного другой текст)

То есть переключение контекста является добровольным, если процесс покидает ЦП, потому что ему больше нечего делать (в ожидании чего-то внешнего). Непроизвольно, если он хотел бы продолжить некоторые вычисления, но ОС решает, что пришло время переключиться на какой-то другой процесс.


То, как все это связано с программой проверки паролей, зависит от того, что на самом деле делает программа.

Из исходного кода, связанного в комментариях, мы видим, что программа вызывает usleep()один раз для каждого несоответствующего символа, после чего продолжая цикл сравнения для следующего символа. Спящий режим является настолько же добровольным, как и выход процессора, так что эти вызовы будут отображаться как произвольные переключения контекста для каждого не обрабатывающего символа.

В Linux вы также должны видеть вызовы с помощью strace.

Окончательная задержка происходит из-за рандомизированного сна T * (rand() % 3), то есть 0, 1 или 2 раза больше постоянной. Это довольно грубая детализация, поэтому ее легко усреднить, выполнив несколько попыток с одним и тем же паролем.

ilkkachu
источник
3
Вот исходный код функции, о которой я упоминал выше. Pastebin.com/iTzheD4u Спасибо, я посмотрю на вызовы с помощью strace и, надеюсь, получу дополнительную информацию. О случайном таймере: Если пароль имеет неправильную длину, время вывода такое же (очень и очень быстрое), и случайный таймер не запускается. Если длина пароля правильная, вывод является случайным, потому что выполняется случайный таймер.
cnmesr
@ cnmesr, это отлично!
ilkkachu