web-dev-qa-db-ja.com

ソフトウェアパスワードをリバースエンジニアリングでバイパスできますか?

私のOS(Windowsなど)で管理者権限を持っているとしましょう。ソフトウェア[〜#〜] xyz [〜#〜]をインストールして実行すると、OSと[〜#〜] xyz [〜#〜]とOSが実行され、[〜#〜] xyz [〜# 〜]します。

これが私のパスワードの認識です(.Zipパスワードなど):

enter image description here

別のコマンドの代わりにコマンドを実行するようにソフトウェアロジックを変更することは可能ですか?もしそうなら、クラックから何も保護することができませんか?

40
T.Todua

つまり、実行可能ファイルを変更したり、デバッガーを使用したりして、実行されているコードのロジックを変更できます。

しかし、それだけでは不十分な場合があります。

「.Zipパスワード」の例を使用するには、パスワードで保護されたアーカイブでパスワードを使用して暗号化キーを取得します。正しいパスワードを入力しない限り、生成されたキーは間違っています。また、間違ったキーを使用するように変更しても、Zipファイルは正常に復号化されません。

別のシナリオには、より高い特権で実行されるsetuid実行可能ファイルが含まれる場合があります。デバッガーの下で実行することも、ユーザーアカウントにコピーして変更を加えることもできますが、これはユーザーのアクセス許可で実行することで、悪用の可能性を打ち消します。

79

まあ.Zipパスワードのあなたの認識は正確ではありません。他の多くのプログラムでも使用されているアプローチは、プログラムが「正しいパスワードか悪いパスワードか」の決定に達する前に、常に復号アルゴリズムを実行して結果を取得することです。秘訣は、復号化によって「魔法のように」(または数学的に)適切なデータを計算する適切なパスワードを除いて、すべてのパスワードにゴミが生成されることです。したがって、プログラムは、適切なパスワードが何かを知りません

ハックしたい「良いか悪いか」の瞬間は、結果がガベージかどうかをチェックするだけです。これをオーバーライドしてもあまりメリットはありません。

42
kubanczyk

はいおよびいいえ

実生活の(コンピューターに関連しない)例はまだだれも出ていないので、ここで試してみます。

飛行機に搭乗しようとしているところを想像してみてください。搭乗券が必要です。そうしないと、セキュリティ担当者があなたを許可しません。システムにアクセスでき、システムを変更できる場合(たとえば、CEOである場合)、セキュリティをバイパスできますか?はい!あなたはできる:

  • セキュリティ担当者を削除します(認証コンポーネント全体を削除します)
  • 全員に立ち入るように男性に依頼する(「乗客が有効な搭乗券を持っている場合」のチェックを外す)
  • 誰かが特別な搭乗券を提示した場合は、アクセスを許可するように依頼してください(偽の資格情報を許可する新しい検証ルールを追加します)

さて、別のシナリオ:たくさんの金庫が銀行に保管されています。金庫を開くには、錠を回すための物理的な鍵が必要です。

前のトリックを引けますか?はい、できますが、役に立ちません。そこに立っているセキュリティ担当者がすべての金庫にアクセスできるようではありません-彼にはどの金庫への鍵もありません。彼から地獄を倒すことができますが、彼は錠を開けるために必要なもの(物理的な鍵)を持っているだけではありません。

ロックを選択する(ブルートフォーシング)ことはできますが、非常に時間がかかります(現代の暗号化キーの計算では、世界中のすべてのコンピューターでロックを解除しても、ロックを解除するには数十億年かかるとされています君は)。つまり、この設計(データ暗号化)では、保存されたデータを取得する唯一の方法はキーを使用することです。これにより、バイパスすることができなくなります。

21
kevin

確かに、ソフトウェアはあなたがプログラムすることを何でもすることができます。

些細な例として、Python=パスワードをチェックするプログラムが提供された場合:

_password = raw_input('Enter your password: ')
if password != 'oh-so-secret':
    sys.exit(1)

do_secure_thing()
_

パスワードを気にしないように変更するだけです。

_password = raw_input('Enter your password: ')

do_secure_thing()
_

(この場合、ハードコードされたプレーンテキストのパスワードを確認して入力することもできます。)

バイナリアプリケーションでは、ソースを変更する前に逆コンパイルする必要がありますが、一般的な言語用の逆コンパイラはたくさんあります。

これが コード署名 が存在する理由です。

さて、これがあなた自身のシステムでない場合、あなたのオプションはもう少し制限されるかもしれません。ほとんどのUnixライクなシステムでは、実行可能ファイルは通常、非rootユーザーの読み取り専用および実行専用の権限で格納されます。したがって、rootでない場合は、ターゲットの実行可能ファイルを変更できません。他にもそれほど直接的な方法はありませんが、失敗した場合は別のベクトルに移動することを検討しています。

たとえば、キーロガーはユーザーが入力したパスワードを記録し、後で自分で再利用できるようにします。

プログラムのソースを変更する必要のないもう1つの攻撃方法は、動的ライブラリロードパスを変更して、プログラムが期待したものではなく、作成したライブラリ呼び出しを使用するようにすることです。動的にロードされる外部ライブラリをパスワード管理に使用し、そのライブラリにブール値を返す関数verify_password()がある場合、常にtrueを返す独自のverify_password()を作成できます。代わりにそれをロードしてください。

答えを「はい」から「いいえ」に変更する本当の違いは、パスワードが実際にはパスワードではなく暗号化キーであるかどうかです。データが暗号化されている場合、外部プログラムが何をしても問題はありません。データは、復号化アルゴリズムに適切なキーが供給されるまで暗号化されます。

テキストファイル(または小さなデータベース)にデータを保存するアプリがあるとしますが、ファイルにアクセスするにはアプリからパスワードを入力するか、特別なプロセスを使用する必要があります。 OSを使用して、ファイルディレクトリからテキストファイル(またはdb)を開くだけです(リバースエンジニアリングは不要)。これは古いプログラム(特にゲーム)でよく発生していました。

そのため、安全性を期待するアプリは、OS自体からデータを保護する手段を講じます。データを暗号化したり、データを難読化して使いにくくするようなものです。

5
schroeder

これは、ソフトウェア[〜#〜] xyz [〜#〜]がパスワードを使用して望ましいアクションを生成する方法と、それが使用するデータのタイプに依存します。

[〜#〜] xyz [〜#〜]プログラムの抽象的なアルゴリズムを見ると、次のようになります。

  1. ユーザーにパスワードの入力を求めます。
  2. ユーザーが入力したパスワードで何かします。
  3. 望ましい出力を生成します(または望ましいアクションを実行します)。

したがって、質問をステップに絞り込むことができます

プログラムXYZを使用せずに望ましい出力を生成する(またはアクションを実行する)ことは可能ですか?

ここでは多くの変形が可能ですが、重要な点は、ソフトウェア[〜#〜] xyz [〜#〜]が結果を生成するために特定のステップを実行することです。

パスワードを必要とせずに妥当な時間で同じ結果を生成できるプログラム[〜#〜] abc [〜#〜]を作成できる場合、[〜#〜 ] xyz [〜#〜]はバイパスできます。

これは、「保護」全体がプログラムに実装されていることを示します[〜#〜] xyz [〜#〜]自体。

そのようなプログラムの作成[〜#〜] abc [〜#〜]が不可能な場合、保護はパスワードを必要とするアルゴリズムに依存しますどのプログラムがそれを使用しようとしているかに関係なく

例1:OSによって強制されているため、権限のないOSアカウントは別のユーザーのパスワードを設定できません。したがって、この場合のOSは[〜#〜] xyz [〜#〜]です。ただし、元のOSは現時点では機能していないため、ブート可能なドライブからコンピューターを起動して、パスワードを含むファイルを上書きすることができます。そのため、保護を適用できません。したがって、[〜#〜] xyz [〜#〜]プログラムを使用せずに望ましい結果を生成することができました。

例2:2番目の例では、OSのシステムドライブは強力な暗号アルゴリズムで適切に暗号化されています。元のOSをバイパスするために起動可能なドライブでコンピューターを起動すると、パスワードを含むファイルにアクセスできないため、目標を達成できないことがわかります。最初に復号化する必要があるパーティションに存在しますが、パスワードがわかりません。復号化プロセスをブルートフォースにしようとすると、すぐに望ましい結果が得られないため、この場合は[〜#〜] xyz [〜#〜]プログラムまたはその他をバイパスすることはできませんでした基礎となるデータにはパスワードが必要であるため、同様の機能を持つ他のプログラム。

3
VL-80

Zipパスワードは、あなたが考えていることの一例ではありません。しかし、多くのものであり、特に、時間または機能セットが制限されている「試用版」バージョンです。

私はプログラミング雑誌の2つの記事を思い出します(おそらく コンピューター言語 です)、その方法と方法を説明していますあなたのコードに対してそれをそれぞれ行う試みを阻止してください。

文字通り比較ステートメントを見つけてジャンプ条件を変更する(つまり、1バイトを変更する)だけで、実際のチェックをバイパスするのが文字通り簡単だったケースを知っています。

これは、作者がプログラムの一部としてコード行を単に記述した場合のときどきケースです。しかし、アクティベーションキーなどについては、業界全体が急成長しており、作者は実際のテストを難読化するキットを含めることができ、プログラマーのデバッグコードに慣れている一般的な手法を使用してプログラムを阻止しようとすると、プログラムが機能しにくくなります。 。

3
JDługosz

それはすべて、パスワードをデコードするときのシステムの動作に依存します。

侵入される可能性のある非常に基本的な「ログイン」タイプのパスワードシステムを想像しています。ただし、ZipファイルやWebサイトでは、さまざまな方法を使用して、システムを編集するだけで人々に対抗し、システムにパスワードを強制的に公開させます。

1つの方法は、MD5を「塩」とともに使用してセキュリティを強化することです。これは、パスワードが元に戻せない認識できないコードに変換されるという事実で機能します-発生する基本的な例は次のとおりです

システムがパスワードを要求する-例PASSWORDシステムは、パスワードに「塩」を追加します。 1234(パスワードはPASSWORD1234になりました)システムはソルトを含むパスワードにMD5を使用します-ほとんどの人はPASSWORD自体がMD5コード319f4d26e3c536b5dd871bb2c52e3178を生成することを知っています完全に異なるコード。

この時点で、システムはまだそのパスワードが有効であったかどうかをチェックしていません。次に、この新しいコードをプログラムの別のセクションに渡し、MD5コードがファイルを表示する場合に予想されるものと一致するかどうかを判断します(初期パスワードは長い間メモリから破棄されています。

このタイプのパスワードを浸透させるには、最初に入力された初期パスワードを取得し、後でプログラムがファイルのオープンを許可したかどうかを確認する必要があります。コンピュータ上の一部のソフトウェアでは、パスワードを取得し、後でファイルが開いているかどうかを確認して、この方法でパスワードを取得できる場合があります。ただし、パスワードがMD5 + saltとして別のサーバーに送信された場合(たとえば、JavaScriptとPHPを使用すると、1台のコンピューターのメモリにパスワードが変換され、phpサーバーにはmd5 + saltのパスワードしかありません。これは、元に戻すことはできません。

その上で使用される別の方法は、パスワードを取得し、それを何らかの方法でデータ内にエンコードすることです。これは、Zipファイルがどのように機能するかです。たとえば、次のテキストを含むファイルがあります。

素早い茶色のキツネが怠惰な犬を飛び越えます

1文字のパスワードを指定します。わかりました、少し単純ですが、これは簡単な例です。コンピュータで変換できます。 ASCII=同等であり、すべての文字のASCIIコードを減算してエンコードします-!のASCIIコードは33で、tのASCIIコードは116および116-33 = 83です。大文字SのASCIIコードなので、データが暗号化されると、上記の行は次のように保存されます。

SGD PTHBJ AQNVM ENW ITLOR NUDQ SGD K @ YX CNF

誰かがこのメッセージを暗号化解除しようとしている場合、彼らが正しいパスワードを持っているかどうかはわかりません-彼らが#ではなく#のパスワードを入力した場合!次のメッセージが返されます

vjg swkem dtqyp hqz lworu qxgt vjg nc | {fqi

意味がありません-ほとんどのシステムは実際にはパスワードの有効性をチェックしますが、最初にパスワードを変更するため、誰かが結果を流用するだけでハッキングされることはありません-これが失敗するのは、誰かが作成したときだけです独自の偽のWebサイトまたはプログラムを使用して、ユーザーに最初に偽のプログラムまたはWebサイトにパスワードを入力させます。もちろん、多くのWebサイトは現在、認証トークンを使用してそれを回避しています。時間(たとえば、HSBCスマートキー)。

2
TheKLF99

質問には説明が必要です。パスワードで保護されたzipファイルがどのように読み取られるかについての理解は正しくありません。他の人が指摘したように、zipファイルは暗号化され(データはスクランブルされています)、パスワードは解読の鍵です。

あなたが説明していること(コードフローのリバースエンジニアリングによるコード実行のリダイレクト)は、プログラムによって強制されている「アクセス制御」を無効にするために機能します。

だから、あなたの元の質問に:

別のコマンドの代わりにコマンドを実行するようにソフトウェアロジックを変更することは可能ですか?もしそうなら、クラックから保護できるものは何もありませんか?

ソフトウェアロジックを変更してコマンドを実行することは確かに可能です。リバースエンジニアリングを介して、アクセス制御をバイパスし、プログラムができることを実行することは可能です。ただし、これは「亀裂から保護できるものは何もない」という2番目のステートメントをサポートしていません。暗号化されたzipファイルは、コードを制御してもファイルの内容を取得できない場合の良い例です。

その場合、キーはコードパスの実行を妨げるゲートキーパーではなく、プレーンテキストデータを取得するために必要なコンポーネントです。プログラムのフロー制御とは関係ありません。

1
JesseM