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

たとえば、私は自分のOS(Windowsなど)に管理者権限があります。ソフトウェアある[ XYZ ]がインストールされて実行されると、OSと XYZ の間に通信が確立され、OSは XYZ のすべてを実行して確認できます。

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

enter image description here

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

40
最終的にあなたが見逃しているのは、暗号化の背後にある数学を理解することだけです。この問題を理解するために、 の章MITのOpen Courseware教材の「コンピュータサイエンスのための数学」の数論 。最後には、実際に鉛筆と紙を使ってRSAアルゴリズムを実行しました。
追加された 著者 devlop,
(プルーフ表記が慣れていない場合は、コースの始めから開始
追加された 著者 devlop,
マニュアルから特定の単語を入力して、それが正しいかどうかを確認する場所保護のいくつかの古いゲームの種類。 Jump-if-zeroをJump-if-not-zero(73hから74h、覚えていれば)に変更するだけで十分でした。
追加された 著者 woliveirajr,
はい、これは最も単純な種類のRCEです。 Debugger/Disassemblerでプログラムを開くだけでジャンプコマンドが見つかります。 youtube.com/watch?v=uydMlQlEiyc をご覧ください。
追加された 著者 Apalala,
DRMベースのソリューションの例:PDF
追加された 著者 Josie Thompson,
これは機能を人為的に制限する多くのプログラムでは完全に可能ですが、暗号化されたデータにアクセスするプログラムでは不可能です。ここで鍵となるのは、パスワードで保護されたzipファイルやpdfファイルなどの暗号化されたデータで、復号化するためのパスワードを知らない限り文字通りどのプログラムからも読み取ることはできません。
追加された 著者 Spike0xff,
悪魔的に賢く、そしてかなり効果的に聞こえる@ShaunWilson。私が実際にデバッグしようとした人(元の開発者ハッカー)に申し訳ないのですが、そのような「魔法」は不愉快です。
追加された 著者 Nikita Demidenko,
TL; DR:すべてのソフトウェア保護メカニズムは元に戻すことで回避できます。 _ALL_itは「if」ではなく「when」です。とは言っても、私はハードウェアレベルのデータトラップを使ってexec/signalスレッドを使って、メモリ内の特定のバイトが書き込まれるたびにパスフレーズの半分を処理していた。誰かが私たちの鍵がどのように格納されているのかを理解する前に…しかし、それはアルゴリズムが発見された後にコードから結局逆転されました。
追加された 著者 Serotonin,
説明していることは、暗号化アルゴリズムに依存しているほとんどのパスワード保護されたリソース(zipファイルを含む)では正しくありませんが、主にDRMベースのソリューションがいくつ動作するかです。
追加された 著者 Tom Castleberry,

11 答え

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

しかし、それだけでは不十分かもしれません。

あなたの ".zipパスワード"の例を使うために、パスワードで保護されたアーカイブは暗号化キーを引き出すためにパスワードを使います。正しいパスワードを入力しないと、生成されたキーは間違ったものになり、間違ったキーを使用するように変更した場合でも、ZIPファイルは正常に復号化されません。

別のシナリオでは、より高い特権で実行されるsetuid実行可能ファイルを使用することがあります。あなたはそれをデバッガの下で実行するか、それをあなたのユーザアカウントにコピーして変更を加えることができますが、これが達成するのはあなたのユーザの許可でそれを実行することだけです。

79
追加された
関連 - stegosploit.info - 提供されたパスワードが異なると、2つの異なる出力になることがあります。
追加された 著者 jenny,

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

あなたがハックしたい「良いか悪い」瞬間は、結果がゴミであるかどうかをチェックするだけです。それを上書きしてもあまり意味がありません。

42
追加された

Yes and No.

実生活(コンピュータに関連しない)の例を誰も思いついていないので、ここで試します

フライトに搭乗しようとしていると想像してください。あなたは搭乗券が必要です、さもなければ、警備員はあなたを通過させません。あなたがシステムにアクセスでき、あなたがそれを変更することができる(あなたが最高経営責任者であると言う)場合、あなたはセキュリティを回避することができますか?はい!あなたはできる:

  • セキュリティ担当者を削除する(認証コンポーネント全体を削除する)
  • みんなに入れてもらうようにみんなに頼みます(「有効な搭乗券があるかどうか」のチェックを外します)
  • 誰かが特別な搭乗券を提示した場合にアクセスを許可するように依頼します(偽の認証情報を許可する新しい確認規則を追加します)

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

前のトリックを引っ張ってもらえますか?はい、できますが、役に立ちません。そこにいる警備員がすべての金庫にアクセスできるわけではありません - 彼は金庫のどれにも鍵を持っていません。あなたは彼から地獄を打ち負かすことができますが、彼はただ鍵を開くために必要なもの(物理的な鍵)を持っていません。

あなたはロックを選ぶこと(ブルートフォース)を試みることができます、しかしそれは非常に時間がかかります(現代の暗号化鍵の数学はあなたがそれをするために世界のすべてのコンピュータを持っているとしても君は)。つまり、この設計(データ暗号化)では、格納されたデータを取得する唯一の方法はキーを使用することであり、これを回避することは不可能です。

20
追加された

もちろん、ソフトウェアはあなたがプログラムすることなら何でもすることができます。

簡単な例として、パスワードをチェックする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()関数を持っているなら、あなたはあなた自身の verify_password()を書くことができますこれは常にtrueを返し、代わりにそれをロードします。

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

17
追加された
署名チェックはハードウェアでもファームウェアでも実装できますが、管理者権限であなたがマシンを所有していることに同意します。
追加された 著者 Dale M,
@OlleKelderman私が答えた時には、管理者権限についての言及はありません
追加された 著者 Dale M,
@kasperdあなたの意見は、答えの最後の段落で述べた特別な場合に有効です。ただし、他のシナリオ(攻撃者が実行可能ファイルを変更することができるなど)では、パスワードがsource/binaryまたはプレーンテキストの平文で格納されているかどうかにかかわらず、被害者は不運です。そうではありません。
追加された 著者 pastorius,
h = '$ 1 $ dikapmhs $ 4YIBUV3/uTlSZ7dF1/VWt /' if crypt(password、h)!= h:そうすると、ソースにプレーンテキストのパスワードがなくなります。
追加された 著者 kasperd,
@Synoli実際に crypt を使用する方がはるかに安全であるか、それとも少しだけ安全であるかは、他にパスワードが攻撃者にアクセス権を与えるものによって異なります。しかし、そのように実装されたパスワード検証がとにかく無意味になるであろう多くの状況があることに同意します。
追加された 著者 kasperd,
ここではコード署名は役に立ちません。署名チェックをtrueに戻すことは簡単です。
追加された 著者 Joshua,
@ XiongChiamiovおおおっと、すみません、その場合は何も言っていません
追加された 著者 Paul Newton,
素晴らしい答えですが、OPは管理者特権を持つことを明確に述べていて、あなたの答えは物語の非管理者側にもっと焦点を当てています
追加された 著者 Paul Newton,

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

安全であることを望んでいるアプリがOS自体からデータを保護するための対策を講じるのはそのためです。データを暗号化したり、データを難読化して使いにくくしたりします。

4
追加された
私はあなたのためにそれを直しましょう。「だからこそ、あいまいになることを望んでいるアプリは、OS自体からデータを保護するための対策を講じます。」アプリがOSから自分自身を保護するためにできることは何もありません。OSはデバッガ特権を持ち、メモリから復号化されたデータを一時停止およびダンプできます。
追加された 著者 Jay Corbett,
@LieRyanあなたがそれを説明するように、私はセキュリティとあいまいさの間の違いに同意します、私は違いがこの場合訂正の価値があるかどうかわからない。私はその文を「希望」で修飾し、難読化をテクニックとして説明します。これらの手法はインメモリでも使用されます。
追加された 著者 schroeder,
@LieRyanが編集します。
追加された 著者 beppe9000,

これは基本的にクラッキングと呼ばれ、デバッガを使用して実行できます。これを達成するためにnoppedすることができるje、jne、jnzなどのような条件付きジャンプがあります。 tuts4youに関するLenaの逆のチュートリアルは良いスタートです。

4
追加された
これは質問に答えないし、とにかく間違っています(例えば暗号化された* .zipファイルのためにあなたの方法をあまりうまく利用できないでしょう)。
追加された 著者 maximdim,

ソフトウェアが XYZ を使用して望ましいアクションを生み出すためにどのようにパスワードを使用するか、およびどのような種類のデータを使用するかによって異なります。

XYZ プログラムの抽象アルゴリズムを見ると、次のようになります。

  1. ユーザーにパスワードの入力を求めます。
  2. ユーザーが入力したパスワードで何かをしてください。
  3. 望ましい成果を生み出す(または望ましい行動をとる)

そのため、質問は#3 のステップに絞り込むことができます。

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

ここで可能な多くの変形があります、しかし主な点はソフトウェアがある[ XYZ は結果を生み出すために特定のステップを実行するということです。

パスワードを必要とせずに妥当な時間内に同じ結果を生み出すことができる ABC プログラムを作成できる場合は、 XYZ をバイパスできます。

それは全体の "保護"がプログラム XYZ 自体に実装されていることを示します。

そのようなプログラムの作成が ABC できない場合、保護はどのプログラムがそれを使用しようとしているかにかかわらずパスワードを必要とするアルゴリズムに依存します。

Example 1: An unprivileged OS account can not set password for another user, because it is enforced by the OS. So the OS in this case is XYZ. But one can boot the computer from a bootable drive and overwrite the file containing passwords, because the original OS is not working at this time, therefore it can not enforce the protection. So, we were able to produce desirable result without using the XYZ program.

Example 2: In the second example, the system drive of the OS is properly encrypted with a strong crypto algorithm. If we boot the computer with a bootable drive in attempt to bypass the original OS we will discover that we can not achieve our goal, because we can not access the file containing passwords. It resides on a partition that needs to be decrypted first, but we do not know the password. An attempt to brute force the decryption process would not bring the desirable result any time soon, therefore in this case it was not possible to bypass the XYZ program or any other program with similar functionality, because the underlying data required the password.

3
追加された

「リバースエンジニアリング」と表現できるプロセスは、タイミング攻撃です。パスワード検証にかかる時間を分析する。実際、アルゴリズムの処理速度を落として、パスワードを拒否するのに必要なプロセッサティック数を数えることができます。あなたがより多くの文字を正しく推測するにつれて、それを拒絶するのにより長い時間がかかるでしょう、それであなたはあなたの推測で案内されることができます。

これは単なる仮想的な状況ではありません。この攻撃は、SSLおよび一部のバージョンのUnixに対して使用されています。

3
追加された

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

私はプログラミング雑誌の中の一対の記事を思い出す(されているかもしれない)その方法と、その試みを阻止する方法について、それぞれコンピュータ言語 )で説明しています。

実際のチェックを迂回するために、比較ステートメントを見つけてジャンプ条件を変更する(つまり、1バイトを変更する)のと同じくらい文字通り単純なケースがわかっています。

これは、作者が単にプログラムの一部としてコード行を書いただけの場合は時に行われるケースです。しかし、アクティベーションキーなどのために業界全体が出現したため、著者は実際のテストを難読化し、プログラマのデバッグコードになじみのある一般的な手法でそれを回避しようとするとプログラムが機能しにくくなるキットを含めることができます。 。

2
追加された

パスワードを解読するときにシステムがどのように機能するかは、すべて異なります。

あなたは潜入することができる非常に基本的な「ログイン」タイプのパスワードシステムを想像しています。しかし、ZIPファイルのようなもの、そしてWebサイトは、システムを編集してパスワードを明らかにさせるだけの人々と戦うためにさまざまな方法を使用します。

1つの方法は、セキュリティを強化するためにMD5と「salt」を併用することです。これは、パスワードが元に戻せない認識不能なコードに変わるという事実に基づいて機能します。

システムがパスワードを要求します - 例パスワード システムはパスワードに「salt」を追加します - 例えば1234(パスワードはPASSWORD 1234になりました) システムはパスワードでMD5をsaltと共に使用します - ほとんどの人はそれ自身のPASSWORDがMD5コード319f4d26e3c536b5dd871bb2c52e3178を生成することを知っているでしょう - しかし、 "1234"塩がパスワードに追加された

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

誰かがこのタイプのパスワードを浸透させるには、最初に入力された初期パスワードを入手し、その後プログラムがファイルのオープンを許可したかどうかを調べる必要があります。コンピュータ上のソフトウェアでは、パスワードを取得し、後でファイルが開かれているかどうかを確認してパスワードを取得することもできます。ただし、パスワードがMD5 + saltとして別のサーバーに送信されている場合例えばjavascriptやPHPを介して)それはそれが変換するそのメモリにパスワードを持っていてphpサーバーが逆変換できないちょうどmd5 + saltパスワードを持っているのでそれはずっともっとトリッキーになります。

使用されている他の方法に加えて、パスワードを取得し、それを何らかの方法でデータ内にエンコードするという方法もあります。これは、たとえば、zipファイルの動作方法です。

速い茶色のキツネは怠惰な犬を飛び越える

1文字のパスワードを渡します。私はそれが少し単純であることを知っています、しかしこれは単純な例です - コンピュータはそれを変換することができます!それをASCIIに相当するものに変換し、それからすべての文字のASCIIコードを差し引いてそれをエンコードします。は33で、tのASCIIコードは116および116 - 33 = 83です。これは大文字のSのASCIIコードなので、データが暗号化されると、上記の行は次のように格納されます。

SGD PTHBJ AQNVM JAW ITLOR NUDQ SGD K @ YX CNF

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

vjg swkem dtqyp hqz lworu qxgt vjg nc | {fqi

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

1
追加された
この答えは、塩に関係なく、パスワード用のハッシュ関数の本当に悪い選択であるMD5についての言及がなければより良いでしょう、そしてそのようなのためにそれを使っている人は誰でも間違っています。それはあなたの模範の信憑性を本当に損ないます。
追加された 著者 IMSoP,

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

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

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

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

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

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

0
追加された