Cで記述されたゲームのコードの脆弱性に関して、簡単な概念実証を実証しようとしています。
文字ログインを検証したいとしましょう。ログインは、ユーザーがグラフィカルメニューから項目を選択することによって処理されますn
(今のところは仮定します)。n=5
アイテムはすべて中世をテーマにしています:
例えば:
_______________________________
| | | |
| Bow | Sword | Staff |
|-----------|-----------|-------|
| Shield | Potion | Gold |
|___________|___________|_______|
ユーザーは各アイテムをクリックしてから、各アイテムの番号を選択する必要があります。
次に、検証アルゴリズムは次のことを行います。
- 選択されたアイテムを決定します
- 各文字列を小文字にドロップします(つまり、次のように
Bow
なりますbow
) - 各文字列の単純な文字列ハッシュを計算します(つまり、 `bow => b = 2、o = 15、w = 23、sum =(2 + 15 + 23 = 40)
- ハッシュに、ユーザーが対応するアイテムに対して選択した値を掛けます。この新しい値は、
key
keys
選択した各アイテムのを合計します。これが最終的な検証ハッシュです- 重要:バリデーターは、ゼロ以外の倍数とともにこのハッシュを受け入れます(つまり、最終的なハッシュが1111に等しい場合、2222、3333、8888なども有効です)。
したがって、たとえば、次のように選択するとします。
Bow (1)
Sword (2)
Staff (10)
Shield (1)
Potion (6)
アルゴリズムは、これらの各文字列を小文字に落とし、文字列のハッシュを計算し、そのハッシュに各文字列に対して選択された数を掛けてから、これらのキーを合計します。
例えば:
Final_Validation_Hash = 1*HASH(Bow) + 2*HASH(Sword) + 10*HASH(Staff) + 1*HASH(Shield) + 6*HASH(Potion)
オイラー法を適用することにより、これらのハッシュが一意ではないことを実証する予定であり、それを証明するための簡単なアプリケーションを考案したいと思います。
私の場合、5つのアイテムについて、基本的に次のように計算しようとしています。
(B)(y) = (A_1)(x_1) + (A_2)(x_2) + (A_3)(x_3) + (A_4)(x_4) + (A_5)(x_5)
どこ:
B is arbitrary
A_j are the selected coefficients/values for each string/category
x_j are the hash values for each string/category
y is the final validation hash (eg: 1111 above)
B,y,A_j,x_j are all discrete-valued, positive, and non-zero (ie: natural numbers)
誰かがこの問題を解決するのを手伝ってくれるか、同様の例(つまり、コード、方程式を解くなど)を教えてもらえますか?最後のステップを解決する必要があります(つまり、(B)(Y)= ...)。
n
最後に、レベルを深くしてから、残りのすべての可能な組み合わせのインクリメント、テストなどを処理する再帰アルゴリズムを作成しました。あまり効率的ではありませんが、機能します。リクエストに応じて提供できます(大きすぎてここに投稿できません)。