バイナリファイルがあり、そのファイルのパスワード(割り当て)を復号化する必要があります。関数も提供されます(バイナリの一部)。この関数は、入力文字列を文字ごとに正しいパスワードと比較し、文字が間違っているとすぐにfalseを返すことを示します。これは時間が漏れ、例えば正しいパスワードの長さを知っているので、安全なアプローチではないようです。しかし、先生が結果(フィット/間違い)を返すためにランダムタイマーを追加したので、私たちは少し難しくなりました...
とにかくリバースエンジニアリングで成功し、正しいパスワードを得ました。これでコマンドラインで使用しています。
/usr/bin/time -v ./program_name enter_password
このコマンドにより、システム時間、交換、実行時間などの多くの情報が得られました。しかし、私にとって最も興味深いのは、「自発的なコンテキスト切り替え」です。なぜなら、入力したパスワード文字が正確であるほど、「自発的なコンテキスト切り替え」が少なくなるからです!
間違った文字を入力すると、「自発的なコンテキスト切り替え」が発生します。
コマンドを入力して文字を入力し、「自発的なコンテキスト切り替え」を観察してパスワードを復号化するのに約2時間かかりました。文字が正しいときはいつでも、自発的なコンテキスト遷移が1ずつ減少します。
私の質問は、「自発的なコンテキスト切り替え」とは何ですか?パスワードを解読するのになぜ役に立ちますか?
答え1
これマニュアルページ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システムで引用されており、リンクされたマニュアルページのテキストは少し異なります)
つまり、プロセスが何もしない(外部イベントが発生するのを待っている間)CPUを離れると、コンテキスト切り替えは自発的です。非自発的で、いくつかの計算を続けたいが、オペレーティングシステムが別のプロセスに切り替える必要があると判断した場合。
これらのうち、パスワードチェッカーとの関連性は、プログラムが実際に実行する操作によって異なります。
コメントにリンクされたソースコードで、usleep()
一致しない各文字に対してプログラムが一度呼び出された後、次の文字に対して比較ループを続行することがわかります。睡眠は CPU を解放するのと同様に自発的であるため、これらの呼び出しは、一致しない各文字の自発的なコンテキストスイッチとして表示されます。
Linuxでは、を使用して呼び出しを表示することもできますstrace
。
最終遅延は、T * (rand() % 3)
定数の0、1、または2倍のランダムスリープモードで発生します。これは非常におおよそのものなので、同じパスワードを使用した複数の試行の平均を簡単に計算できます。