「悪意のあるコード解析の実践」実験 - Labs-05

「悪意のあるコード解析の実践」実験 - Labs-05

「Malicious Code Analysis Practice」に実験を記録し、関連リンクを提供します。

Labs-05-1 実験

1. DLLmain関数のアドレスは何ですか?
   回答: 0x1000D02E、[関数名] ウィンドウで DLLMain 関数をダブルクリックして、メイン ウィンドウにジャンプします。

ここに画像の説明を挿入します
2. [インポート] ウィンドウを使用して gethostbyname を参照します。インポート関数はどのアドレスを検索しますか?
   回答: 0x100163CC を見つけて、メイン ウィンドウで [ラベルのインポート] ボックスを開きます。

ここに画像の説明を挿入します
3. gethostbyname を呼び出す関数はいくつありますか?
    回答: gethostname を直接呼び出した 5 つの関数
    アイデア: まず関数 0x100163CC の最初のアドレスを見つけ、次に gethostbyname を右クリックして、相互参照を選択します。5 つの関数が gethostbyname を直接呼び出していることがわかります。

ここに画像の説明を挿入します
ここに画像の説明を挿入します

4. 0x10001715 の gethostbyname への呼び出しによってどの DNS 要求がトリガーされるかわかりますか?
    回答: "pics.praticalmalwarewareanalysis.com" へのリクエストが開始されます;
    アイデア: まず gethostbyname 関数の呼び出しポイントを 0x10001715 に見つけ、次に、前の eax で渡されたパラメータがメモリ内のデータであることを確認し、その後追跡、ドメイン名の文字列「[This is RDO] pics.praticalmalwarewareanalysis.com」を取得し、その後に 0Dh を続けると、前の「[This is RDO]」文字列をスキップして、ドメイン名を直接ポイントします。

ここに画像の説明を挿入します
ここに画像の説明を挿入します

5. IDA Pro は、サブプロセス内の 0X10001656 のローカル変数をいくつ識別しますか?
    回答: ローカル変数は合計 23 個あり、ローカル変数には var_ プレフィックスが付いています。
    アイデア: まず 0x10001656 を見つけてから、変数を表示します。次の 16 進数は ebp オフセットでの変数のアドレスを表すため、ローカル変数はすべて負の値、パラメーターは正の値になります。

ここに画像の説明を挿入します

6. IDA Pro が認識する 0X10001656 のサブプロセス内のパラメーターはいくつですか?
    答え: パラメータ

ここに画像の説明を挿入します

7. [文字列] ウィンドウを使用して、逆アセンブリ内の文字列「\cmd.exe /c」を見つけます。これはどこにありますか?
    回答: 文字列は 0x100101D0 にあります;
    アイデア: メイン ウィンドウのオプションで [検索] --> [テキスト] を選択し、「\cmd.exe」と入力して文字列の場所を見つけます (上記は文字列が参照される場所です)。以下はメモリ内の実際の場所です)、ダブルクリックしてトレースします。

ここに画像の説明を挿入します

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

8.「\cmd.exe /c」を参照するコード領域では何が起こりますか?
    推測: この領域の機能は、リモート シェルを確立することです。
    アイデア: 前部領域と後部領域にそれぞれ文字列と関数を表示します。

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

9. 0x100101C8 では、dword_1008E5C4 はグローバル変数のようなもので、どのパスを取るかを決定するのに役立ちます。悪意のあるコードはどのように dword_1008E5C4 を設定しますか? (dword_1008E5C4 の相互参照を使用するように求めるプロンプト)
    アイデア:

  • 1) まずこの変数をトレースし、次に変数の参照を確認すると、書き込み参照が 1 つと読み取り参照が 2 つあることがわかり、書き込み参照に注目します。
    ここに画像の説明を挿入します

  • 2) 書かれたリファレンスをトレースすると、その値が eax によって代入されていることを確認します。これまでに明らかな eax 代入操作はありませんが、その前に関数呼び出しがあり、eax は関数の戻り値を格納するためによく使用されるため、このグローバルの値は変数はここで決定できます。 はこの関数によって決定されます
    ここに画像の説明を挿入します

  • 3) 関数を追跡し、その関数が内部でシステム関数を呼び出していることを確認します。MSDN 検索では、これらの関数が主にコンピュータ システムのバージョン情報を取得するために使用されていることが判明したため、最初にこのグローバル変数に格納されているシステム バージョン情報を決定します。
    ここに画像の説明を挿入します

10. 文字列を比較するための 0x1000FF58 のサブプロセスに memcmp があります。「robotwork」の文字列比較が成功した場合 (memcmp が 0 を返した場合)、どうなりますか?
    回答: 照合が成功すると、コンピュータのレジストリがリモート C&C に送信され
    ます

  • 1) 文字列に基づいて対応するコードの位置を検索し、一致した場合は sub_1000525A 関数が呼び出されます。
    ここに画像の説明を挿入します

  • 2) この関数を表示するためにトレースし、主にいくつかの呼び出し関数呼び出しを観察します
    レジストリ操作:
    ここに画像の説明を挿入しますここに画像の説明を挿入します
    別の関数に従ってください:
    ここに画像の説明を挿入します
    この関数の送信関数 (ネットワーク データ パケット送信関数) をトレースします。
    ここに画像の説明を挿入します

11. PSLIST エクスポート機能は何をしますか?
    回答: プロセスと
    スレッドのステータスと情報を取得します

  • 1) まず、エクスポートされた関数を確認します。
    ここに画像の説明を挿入します

  • 2) PSLIST 関数をトレースし、
    グラフ モードで観察します。
    ここに画像の説明を挿入します ここに画像の説明を挿入します
    最初のモジュールの関数呼び出しは、質問 9 で分析した関数と同じであり、システムのバージョン情報を取得するために使用されます。
    ここに画像の説明を挿入します

  • 3) システムバージョン情報取得後、判定が続き、1 回目の判定でモジュール 1 から 2 または 6 にジャンプするか、2 回目の判定でモジュール 2 から 3 または 4 にジャンプするかを判定します。
    ここに画像の説明を挿入します

  • 4) モジュール 3 とモジュール 4 を分析すると、それらが呼び出した関数 (つまり、sub_10006518 と sub_1000664C) は、コンピューター上で実行されているプロセスとスレッドの情報を取得するというほぼ同じ機能を持っていることがわかりました。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

  • 5) 最後に、これらのプロセスとスレッドの情報を呼び出し元に返します。

12. グラフ モードを使用して sub_10004E79 の相互参照グラフを描画します。この関数を開始するとき、どの API 関数を呼び出すことができますか? これらの API 関数のみに基づいて、この関数の名前をどのように変更しますか?
    アイデア:

  • 1) 関数の場所を見つけて右選択し、[Xrefs chart from...] を選択します。これにより、使用可能な相互参照関数 (関数と呼ばれる) がグラフ モードで表示されます。
    ここに画像の説明を挿入します

  • 2) 呼び出される可能性のある関数は次のとおりです: GetSyetemDefaultLangID はシステムのデフォルトの言語チェック関数、文字列印刷関数、文字列長計算関数、ネットワーク データ送信関数 send などです。この関数の機能は取得することであると推測されます。オペレーティング システムの言語情報。この情報はネットワーク データとして送信されます。
    ここに画像の説明を挿入します

13. DLLMain が直接呼び出す Windows API はいくつありますか? 深さが 2 の場合、いくつ呼び出されます
    ?

  • 1) [関数名] ウィンドウで DllMain 関数を選択し、[IDA ビュー] サブウィンドウをクリックして、メイン ウィンドウで [表示] --> [グラフ] --> [ユーザー外部参照チャート…] を選択します。
    ここに画像の説明を挿入します
  • 2) 表示する必要がある深度は 2 なので、深度の値を 2 に設定します。
    ここに画像の説明を挿入します
  • 3) 非常に複雑な関数呼び出しグラフを取得する DllMain 関数には、深さ 2 の呼び出し関数が多数あります。
    ここに画像の説明を挿入します

14. 0x10001358 でスリープ関数の呼び出しがあります。このコードが実行されると、プログラムはどれくらいスリープしますか?
    答え: 30 秒間スリープします
    アイデア:

  • 1) まずそこに移動し、sleep 関数のパラメータが eax によって渡されていることを確認します。
    ここに画像の説明を挿入します

  • 2) オンライン解析を続行し、eax がメモリ アドレス off_10019020 の内容によって決定されることを確認し、メモリをトレースすると文字列であることがわかります。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

  • 3) 分析を続けると、eax に 0x0Dh が追加されます。これは、文字列を指す開始アドレスが戻されることを意味します。0x0Dh の 10 進数値は 13 で、文字列全体の長さは 15 なので、eax は " を指すようになります。 30"; さらに下に進むと、atoi という関数があります。この関数は文字列を整数に変換するので、 eax=0x1E (10 進数の 30); 引き続き下に進みます eax=eax*0x3E8=0x7530 (10 進数の 30000); したがって、スリープ時間はは 30000 ミリ秒または 30 秒です

15. 0x10001701 はソケットへの呼び出しですが、その 3 つのパラメータは何ですか?
    回答: パラメータは次のとおりです: 通信ドメイン (2)、セットバイトタイプ (1)、プロトコルタイプ (6)ここに画像の説明を挿入します

16. IDA で MSDN ページのソケットと名前付きシンボリック定数を使用して、パラメータをより意味のあるものにすることはできますか? 変更を適用した後のパラメータは何ですか?
つまり、上記のパラメータをソケット関数で指定されたパラメータ表現に変換します: 2 は通信ドメインの AF_INET を表し、1 は設定されたバイト タイプの SOCKET_STREAM を表し、6 は IPPROTO_TCP を表します。これらは MSDN で照会できます。

17. in 命令 (オペコード 0xED) の使用を検索します。この命令とマジック ストリング VMXh は VMware の検出に使用されます。この検出は悪意のあるコードで使用されますか? in 命令を実行する関数への相互参照を使用して、 VMware を検出した証拠をさらに発見しますか?
    答え: できます
    考え:

  • 1) まずコード検索を実行し、メインウィンドウのタブバーで検索 --> バイト列を選択し、ED を検索します。ここに画像の説明を挿入しますここに画像の説明を挿入します
  • 2) in 命令を見つけて、指定された場所にジャンプします
    ここに画像の説明を挿入します
  • 3) 奇妙なデータを見つけたので、それを選択して右クリックすると、文字列に変換され、ターゲット文字列「VMXh」であることがわかりました。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
  • 4) コード ブロックを変更する関数 (sub_10006196) を見つけて、それに対する他の関数の相互参照を確認します (関数を選択して X キーを押します)。
    ここに画像の説明を挿入します
  • 5) 最初の呼び出しを選択してビューに入り、グラフ モードに移動します (スペース バーを押すか、右クリックして [グラフ ビュー] を選択します) モジュール 3 は、前に注目した sub_10006196 関数呼び出し部分です。
    ここに画像の説明を挿入します
  • 6) モジュール 1 はプログラム インストール関数 InstallRT であり、モジュール 6 はこの関数の終わりであることがわかります。これは、プログラム インストール プロセス中に最終的に sub_10006196 関数が呼び出されるということを意味します。
    ここに画像の説明を挿入します
  • 7) 分析を続行し、モジュール 4 で不審な文字列「仮想マシンが見つかりました。インストールをキャンセルします」を見つけます。つまり、このモジュールのプロセス ロジックは、プログラムの実行環境の仮想マシンを検出し、仮想マシンが存在しない場合はインストールをキャンセルします。機械が見つかりました。
    ここに画像の説明を挿入します
  • 8) したがって、モジュール 1 がインストールを開始し、最初の検出を実行すると推測します。仮想マシンが検出されない場合は、インストールのためにモジュール 5 に入ります。仮想マシンが存在する可能性があることが検出された場合は、2 番目の仮想マシンのモジュール 2 に入ります。仮想マシンが検出された場合は、モジュール 4 に直接ジャンプし、インストールをキャンセルします。検出されない場合は、モジュール 3 に進み、3 番目の仮想マシンを検出します。検出されない場合は、モジュール 5 に進み、インストールします。検出されない場合は、モジュール 4 に進みます。インストールをキャンセルします。

18. カーソルを 0x1001D988 に移動します。何が見つかりますか?
    答え: 隠された悪意のあるコード
    アイデア:

  • 1) まず、目的のアドレスを見つけて、奇妙な文字列を見つけます。16 進値を見てみましょう。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
  • 2) この文字列は少し変です。前後に何もありません。これをコードに変換してみましょう(アドレスを直接選択して C を押します)。突然、悪意のあるコードが挿入されていることがわかりました。これらのコードをよく見てください。それは間違いです。これらのコードのロジックは非常に混乱しており、不完全であり、正しいコードであるはずがありません。
    ここに画像の説明を挿入します

19. プラグイン内で追加の py スクリプトを実行する IDA Python プラグインをインストールするとどうなりますか?

20. カーソルを同じ位置に置いてデータを単一の ASCII 文字列に変換するにはどうすればよいですか?

21. テキスト エディターを使用してこの py ファイルを開きます。どのように機能しますか?
実験チュートリアルを読んだ後、上記の文字列を復号化する必要があることがわかり
、恥ずかしながらコードとして解析してみました。

  • 1) まずPythonスクリプトを開きます
    ここに画像の説明を挿入します
  • 2) 同じ機能を持つ idc スクリプトを作成します。
    ここに画像の説明を挿入します
  • 3) カーソルは開始位置で停止します
    ここに画像の説明を挿入します
  • 4) メイン ウィンドウのタブで [ファイル] -> [スクリプト ファイル] を選択し、完了したばかりの IDC スクリプトをロードします。
    ここに画像の説明を挿入します
  • 5) 文字列が変更され、Hex ビューで確認すると、文字列は正常に表示されます。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_39561364/article/details/108585373
おすすめ