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 より小さい場合、登録失敗を示します。

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

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

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

image

image

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

image

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

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

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

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