banner
lca

lca

真正的不自由,是在自己的心中设下牢笼。

《ゼロから始めるIDA逆アセンブリ》学習ノート-8(静的逆アセンブリ分析入門)

image

一般的に、逆向分析は巨大なプログラムを完全に逆向するのではなく、特定の位置にある 1 つまたは複数の関数を分析することです。

1、プログラムの読み込み詳細#

メニューの VIEW-OPEN SUBVIEW-SEGMENTS を開くと、自動的に読み込まれたプログラムブロックが表示されます。

image

image

セクションの名称(NAME)列の後ろには、区段起始(START)終点(END)のアドレスがあります。
RWX の列は、初期状態でこのセクションが読み取りREAD(R)、書き込みWRITE(W)、および実行EXECUTION(X)の権限を持っているかどうかを示します。
後ろのDLの列はそれぞれDEBUGGER(デバッガ)LOADER(ローダ)に対応しています。
最初の列 (D) は空で、プログラムがデバッグモードのときにのみ読み込まれたセクションが埋め込まれ、L の列はローダが作成したセクションを表示し、他の列の内容はそれほど重要ではありません。

2、重要な文字列の確認#

exe プログラムを開こうとします。

image

help-register で name と serial を入力できます。

image

任意の文字を入力すると、No luck there, mate! と表示されます。

image

文字列を確認するには、ショートカットキー shift + F12 を押します。

image

プログラムと同じメッセージが表示されます。

image

上の画像の文字をダブルクリックすると、次の位置にジャンプします。

image

0x00402169 アドレスにこの文字列が保存されており、そのアドレスでDキーを押すと具体的なバイトを確認できます。

image

image

再度 A キーを押すと文字列が表示され、X キーを押すと右側の参照がより良く表示されます。

image

3、重要な関数の検索#

上の画像には、2 つの異なる関数がこの文字列を参照しています。一つはsub_401362、もう一つはsub_40137Eです。

異なる 2 つの関数である理由は、IDA が参照を functions + XXXX という形式で表示するためです。もし彼らが同じ関数に属しているなら、XXXX の値だけが変わり、前の部分は変わりませんが、sub_の後のアドレスは異なります。

image

sub_401362

image

sub_40137E

現在、登録不成功のメッセージが表示されるすべての位置を見つけました。

sub_401362関数に戻ると、ここで messagebox API 関数を呼び出して NO LUCK THERE MATE というメッセージを表示しています。この API 関数は NO LUCK 文字列をウィンドウのタイトルとして、NO LUCK THERE MATE 文字列を表示するテキストとして受け取ります。

sub_40137Eも同様で、2 つの場所で登録不成功のメッセージがトリガーされることを意味します。異なる情報を処理している可能性があります。登録成功のメッセージを表示するには、これら 2 つの場所を回避する必要があります。

次に X キーを押してsub_401362関数の参照を確認すると、次の画像のように、参照は 1 つだけです。

image

この参照に移る前に、sub_401362関数の名前を CARTEL_ERROR に変更します。関数のアドレスでNキーを押し、この新しい名前を入力します。

image

CARTEL_ERROR 関数を参照している場所に来ました。

image

CARTEL_ERROR 関数を呼び出す前にもう 1 つの jz ジャンプがあり、成功 / 失敗のコードブロックを区別するために、これらのコードブロックに色を付けることができます。コードブロックの右上隅の色選択器をクリックします。

image

0x40124c で Enter キーを押して、呼び出される関数 0x40134d に入ります。

image

image

0x40134D 関数

image

0x40134D 関数を CARTEL_BUENO という名前に変更します。

それらを参照しているコードブロックを緑色にします。

image

4、命令位置のマーク#

0x401243 コードの jz 命令に移動し、メニュー JUMP-MARK POSITION(ショートカットキー alt + m)を開き、DECISION_FINAL という名前を付けます。これでこの位置に簡単に戻ることができます。

image

image

メニュー Jump-Jump to marked position を開きます。

image

これで対応する位置に簡単にジャンプできます。

image

5、命令の変更#

以前の分析に従って、0x401243 の JZ を JNZ に変更すると、不正なパスワードを入力したときに、プログラムは登録成功のパスを実行します。

注:keypatch

7.6 バージョンには keypatch プラグインがないため、インストールを試みましたが、インストールできなかったため、ida 7.7 のグリーン版を使用しました。

現在の命令の位置で右クリックし、keypatch-patch(ショートカットキー:ctrl + alt + k)を選択します。

image

次のウィンドウが開きます。

image

変更内容は以下の通りです。

image

変更後、patch をクリックすると、次の内容が返され、後の注釈が変更内容を示します。

image

再度右クリックしてpatching-apply patch to...を選択し、変更後の内容を保存します。

image

exe ファイルとして保存します。

image

crackme.exe プログラムを実行し、任意の内容を入力すると、成功のメッセージと失敗のメッセージが 2 つ表示されます。

image

image

以上のように、登録を回避するためには 2 つの内容を変更する必要があります。

image

上の画像のように、ここには別の登録失敗のメッセージが表示され、赤いコードブロックの上には cmp 命令があり、ユーザーが入力したユーザー名の文字が 0x41 より小さいかどうかを比較しています。つまり、文字 A です。もし 0x41 より小さければ、登録失敗のメッセージが表示されます。

以前、crackme.exe で登録する際に入力したのは 111(0=30、1=31)で、明らかに 0x41 より小さいため、プログラムが数字を含むことを検出すると、登録失敗のメッセージが表示されます。ここでは jb を jnb に変更することはできません。そうでなければ、文字を入力するとエラーが表示されます。

上の画像の破線は、プログラムがここにジャンプするとエラーが表示されることを示しています。したがって、ジャンプ命令を nop に変更すると、プログラムはジャンプせず、次の命令を実行し、ここでのエラーを実行しません。

グラフィカル表示に戻ります。

image

image

変更後、全体のインターフェースが混乱しています。

image

上の画像では、変更された nop バイトが表示され、エラーメッセージも孤立しています。

変更後のファイルを再保存します。

テストが完了した後、任意の文字の入力がサポートされました。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。