0

私の友人が、彼がコーディングした小さなプログラムをハックするよう私に挑戦しました。基本的には画像を表示するexeファイルですが、そのためにはパスワード付きのキーファイルが必要です。

ollydgb でリバース エンジニアリングを開始したところ、key.txt という名前のファイルが存在し、パスワードが含まれている必要があることがわかりました。私が気付いたもう 1 つのことは、私の友人がパスワードを使用してメモリ アドレスを計算し、それを呼び出していることです。そのため、間違ったパスワードを使用すると、アプリケーションがランダムなアドレスにジャンプするため、おそらく違反が発生してアプリケーションがクラッシュします。

彼は基本的にパスワードを EBX に保存します。彼は固定値 EAX を置きます。次に、ADD EAX、EBX、最後に CALL EAX を実行します。

したがって、これらすべてを知っていて、次に実行するアドレスがわかっている場合は、EAX に格納されている固定値からアドレスを差し引くだけで、パスワードに対応する HEX 値を取得できます。

私の問題は、次に実行されるアドレスをどのように知ることができるかということです。私はクラッキングにかなり慣れていません...

CALL の後に次のアドレスを指定しようとしましたが、うまくいきません。使用しているライブラリも確認しましたが、確かにopengl32が表示されますが、そのライブラリにジャンプする必要があるかどうかはわかりません。

私の質問は、実行される次のアドレスをどのように把握できますか?

4

2 に答える 2

2

X86 命令セットの属性の 1 つは、可変長 (命令は可変バイト数を使用してエンコードされます) であるにもかかわらず、命令シーケンスがかなり迅速に収束することです。つまり、関数の開始点として場所をランダムに選択し、その時点から逆アセンブルを開始しても、それほど混乱することはありません。逆アセンブルした命令のいくつかは間違っていますが、最終的に (そしてすぐに) 本物の命令にたどり着きます。

つまり、実行可能ファイルでランダムなアドレスを選択したり、関数のプロローグやエピローグなどの一般的なパターンを探し始めたりすることができます。それらは、コードがどこにあるかについてのヒントを与えることができます。

ただし、これは、友人がアセンブリを手書きしたり、コードを難読化したりしていないことを前提としています。

ただし、彼が何をしても、インポート アドレス テーブル内のメソッドへの呼び出し、またはシステム コール命令がいくつかあります。これらは、コードを実行して画像を描画するか、難読化されたコードを解読できるようにプロセスのページ テーブルを変更します。それらのパターンはより信頼できるでしょう。そのため、最初に iat (インポート アドレス テーブル) をダンプし、興味深い関数の呼び出しを探すことから始めてください。それでもうまくいかない場合は、システム コールのパターンを探してみてください。正確に何を探すべきかは、使用している特定の OS によって異なります。

次の点に注意してください。

  1. 友人が ASLR (アドレス空間レイアウトのランダム化) をオフにしていない場合、正しいパスワードを持っていても、コードが常に機能するとは限りません。

  2. 私は olydbg にあまり詳しくありませんが、再帰的降下逆アセンブルを使用していると仮定します。その場合、静的に解決可能な呼び出しがないため、ターゲット関数が逆アセンブリに含まれない可能性があります。

2 を解決するには、命令をデコードして自分で分解するコードを書きたいと思うでしょう。開始するのに最適な場所は、間接呼び出し命令を探して exe をスキャンすることです。その後、システムコールを試してください。

アップデート

もう 1 つ: exe セクションを書き込み可能にするか、データ セクションを実行可能にする (または nxbit をオフにする) ように exe が構成されている場合、イメージにシステム コールがない可能性があります。開始する前に、健全性チェックとして、画像のセクション テーブルを見て異常がないか確認することをお勧めします。

于 2012-10-17T05:12:36.400 に答える
0

プログラムが小さい場合を除き (つまり、数 KB のコードを意味します)、簡単に理解することはできず、コード分析を実行し、仮説を立てて、試行錯誤によってそれらを確認または反証する必要があります。

私の頭に浮かぶ最初のことは、コードに存在する関数を見つけることですが、制御をそれらに転送する呼び出し/ジャンプ命令はありません。画像を描画するために呼び出す必要がある関数 (関連する OpenGL/DirectX/GDI 関数を呼び出す関数) を最初に特定することで、検索を絞り込むことができます。そして、そこから逆方向に作業できます。

実行可能ファイルのデータセクションに関数ポインター/アドレスがあるかどうかを確認することも役立つ場合があります。これは、コンパイラーが他の関数またはポインターによって参照されていない関数を削除する可能性があるためです。コンパイルされた実行可能ファイルにまだ存在するためには、それへの参照がどこかにある必要があります (もちろん、コードがすべての最適化をオフにしてコンパイルされている場合を除きます)。

いずれにせよ、残念ながら、多くのコードを実行する必要があります。

もう 1 つの確認事項は、実行可能ファイル自体とそのセクション (名前、サイズ、場所、内容など) です。それはあなたにいくつかの手がかりを与えるかもしれません。

于 2012-10-17T00:55:15.330 に答える