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

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

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

Labs-06-1 実験

  1. main 関数によって呼び出される唯一のサブルーチンにあるメイン コード構造は何ですか?
    1) main 関数を選択し、右クリックしてその相互参照図をクエリします。
    ここに画像の説明を挿入しますここに画像の説明を挿入します
    2) sub_1000 関数を見つけて、分析する関数を入力します。InternetGetConnectedState 関数が呼び出されていることを確認し、「Success...」もあります。 " と "エラー..." という文字列がある場合、このプロセスはネットワーク接続テストであると思われます。
    ここに画像の説明を挿入します
    3) プロセスの構造を表示するには、マウス メールで [グラフ ビュー] を選択します。CMP とジャンプ ステートメントは if ステートメントである必要があります。
    ここに画像の説明を挿入します

  2. 0x40105F のサブプロセスは何ですか?
    1) この場所を見つけて、3 つの関数呼び出しがあることを確認します。
    ここに画像の説明を挿入します
    2) 1 つ目と 3 つ目の関数はシステム関数なので、ここでは無視します。2 つ目の関数に注目して、最初に実行してください。 3) そう
    ここに画像の説明を挿入します
    でない場合は、理解しやすいので、図を使用します。モデルを見てみましょう:
    ここに画像の説明を挿入します
    4) この関数は複雑すぎるため、必要がない限り 1 つずつ分析しません。私たちの目的は、0x40105F で sub_40105F 関数の関数を分析することです。これは、この関数が呼び出す関数 sub_401282 が複雑すぎるため、それが呼び出された場所から分析し、それに対する他の関数の相互参照をチェックし、sub_40105F を選択します。 X キーを押して、どこで呼び出されているかを確認します:
    ここに画像の説明を挿入します
    5) 偶然にも、これら 2 つの呼び出しは同じ関数 sub_401000 内にあります。たまたまこの関数が最初の質問で分析され、グラフ モードに入ったことが判明しました: 6) 次のことが判明しました。両方の
    ここに画像の説明を挿入します
    呼び出しは sub_401000 で行われました 関数の if はネットワークの状態を決定します。つまり、この関数はインターネットに接続されているかどうかに関係なく呼び出されます。同時に、両方の呼び出しはパラメーターとして文字列を関数 sub_40105F に渡します。これは文字列印刷関数であり、他の関数 (データ パケットの送信など) が追加される場合もあります。

  3. このプログラムの目的は何ですか?
    1) peid を使用して分析し、インポートされた関数テーブルを確認すると、WININET.DLL で InternetGetConnectedState 関数が呼び出されており、Kernel32.dll の関数には他に疑わしい関数がないことがわかります。この
    ここに画像の説明を挿入します
    プログラムは機能: ホストの現在のネットワーク接続ステータスを取得する

Labs-06-2 実験

  1. Main 関数によって呼び出される最初のサブルーチンは何を実行しますか?
    1) まず、
        文字列検索文字列の静的分析を実行します。成功したプロンプト文字列とエラー プロンプト文字列、および URL と IE ブラウザのバージョンを見つけて、ターゲット URL へのアクセスに IE ブラウザが使用されている可能性があると推測します。
    ここに画像の説明を挿入します
       Peid がインポート関数分析を実施したところ、WININET.DLL ライブラリは URL やネットワーク接続状態にアクセスするための関数を呼び出していること、KERNEL32.DLL 関数は現在のプロセス リストの取得など明らかな悪意のある操作を意図せずに他の関数を呼び出していることが判明しました。 ,
    ここに画像の説明を挿入します
    first サブプロセスは 0x401000 にある最初のサブ関数の呼び出しです
    ここに画像の説明を挿入します
    3) この関数は Lab-06-1 実験解析の関数であることがわかります このプロセスはネットワーク接続状態を取得します。
    ここに画像の説明を挿入します
  2. 0x40117F のサブプロセスは何ですか?
    ターゲットアドレスを特定します。プロセスは Lab-06-1 で解析したものと同じです。関数は文字列出力関数である必要があります。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
  3. main 関数によって呼び出される 2 番目のサブルーチンは何をするのでしょうか?
    1) 2 番目のサブ関数 (サブプロセス) を見つけます。
    ここに画像の説明を挿入します
    2) この関数を追跡すると、この関数が、先ほど PEID で分析した WININET.DLL にインポートされた関数を呼び出していることがわかります。つまり、この関数の関数は次のとおりです。ネットワークに接続 ターゲット URL にリクエストを送信するアクション。
    ここに画像の説明を挿入します
  4. このサブプロセスではどのようなタイプのコード構造が使用されていますか?
    1) グラフ ビューを使用して、コードのこの部分を分析します。このプロセスには 11 のモジュールがあります。2)
    ここに画像の説明を挿入します
    最初のモジュールから分析を開始します。ここでのジャンプは、InternetOpenUrlA 関数の戻り値を 0 と比較し、次に To Jump では、指定された URL リクエストの結果を決定するために if ステートメントが使用される必要があります。
    ここに画像の説明を挿入します
    3) 最初のジャンプと似ていますが、関数が変更されていて、これも if 構造ステートメントである点が異なります。4)
    ここに画像の説明を挿入します
    モジュール 3、4、5、および 6 はすべて同じジャンプ構造を使用しており、多層 if である必要があります。ネストされたステートメント。比較内容はそれぞれ文字「<」、「!」、「-」、「-」です。これらの比較される変数はメモリ内で隣り合っているため、最初の部分は文字列である可能性があると推測されます。 match プロセスでは、マッチング対象は「<!–」です。InternetReadFile 関数は比較のためにモジュール 2 で使用されており、その 2 つの分岐はそれぞれ 8 と 3 に進みます。このうち、モジュール 8 では「Error...」という文字列が出力されますが、これは明らかにネットワーク データの読み取りに失敗していますが、逆にモジュール 3 以降はネットワーク データの読み取りに成功するためのロジックです。前の分析では、モジュール 3、ブランチ 4、5、および 6 が、読み取られたネットワーク データに対して文字列「<!–」のマッチングを実行します。待ってください、ネットワーク データ、文字列「<!–」は一般的なネットワーク データ html のコメント記号ではないため、この部分の機能は、取得したネットワーク データの形式チェックを実行して、それが html ファイルであるかどうかを検出することだと思います。
    ここに画像の説明を挿入しますここに画像の説明を挿入します
  5. このプログラムには Web ベースの指示はありますか?
    1) 悪意のある Web サイト「www.practicalmalwareanalysis.com」にアクセスする
    2) Web サイトから HTML ファイルを取得する
    これまでの質問の答えを組み合わせると、プログラムは IE を通じて悪意のある Web サイト「www.practicalmalwareanalysis」にアクセスすると結論付けることができます。 7.5 バージョンのブラウザ。.com」にアクセスし、そこから html ファイルを取得します。
  6. この悪意のあるコードの目的は何ですか?
    前の分析と組み合わせると、このプログラムのガイダンスの目的は、
    1) 現在のコンピューターのネットワーク接続ステータスを取得する
    、2) 接続が正常であれば、悪意のある URL にリクエストを送信する、
    3) から html ファイルを取得することです。悪意のある URL

Labs-06-3 実験

静的解析:

  1. 最初にシェルを確認します。シェルなしで C++ 6.0 で書かれています。
    ここに画像の説明を挿入します
  2. PEID を使用してインポート機能を分析します。3 つの DLL の重要なインポート機能は、
    KERNEL32.dll: フォルダーの作成、ファイルのコピー、ファイルの削除、プロセスの終了、システム バージョンの取得、
    WININET.dll: 現在のネットワーク ステータスの確認、開いて読み取りです。ネットワーク ファイルを取得し、URL を使用して
    ネットワーク経由で ADVAPI32.dll にアクセスします。レジストリを開いて変更します。
    ここに画像の説明を挿入します
  3. Strings は、その中の文字列を分析し、これらの文字列に基づいてこのプログラムの可能な機能を推測します。
    I) ネットワークのステータスを確認します
    。 II) ネットワークに接続し、指定された URL にリクエストを送信して、指定されたファイルを取得します。
    III) レジストリを変更します
    。 IV) ) 悪意のあるプログラムが自動的に起動します
    ここに画像の説明を挿入します

質疑応答

  1. main関数の呼び出しを6-2のmain関数と比較してください、このmain関数によって呼び出される新しい関数は何でしょうか?
    回答:新しい関数は sub_401130 です。
    ここに画像の説明を挿入します

  2. この新しい関数はどのようなパラメータを使用しますか?
    回答: 2 つのパラメータが使用されます。1 文字 (要求されたネットワーク ファイルの 5 番目の文字) と、ファイル名 (現在のプログラムのファイル名) です。
    1) 分析する関数を入力します。
    ここに画像の説明を挿入します
    2) 関数の呼び出しプロセスを分析します。
    ここに画像の説明を挿入します
    3) 2 つの関数がそれぞれ変数 var_8 と argv によって決定されることを確認します。振り返ってみると、argv は main 関数のパラメータ (現在実行中のプログラムのファイル名) であることがわかりました。var_8 は関数 sub_401040 によって決定されます。 4) 分析のために関数 sub_401040 を入力すると、これが 4 番目の質問であることがわかります
    ここに画像の説明を挿入します
    。 Labs-06-2 分析された関数; この関数の eax の最後の変更を確認すると、モジュール 9 の al に対する操作を除いて、他のモジュールが al をクリアするため、返される内容はモジュール 9 に依存することがわかります。
    ここに画像の説明を挿入します
    5) Labs-06-2 の 4 番目の質問で、この関数のモジュール 3、4、5、および 6 ブランチを分析しました。これらは、読み取られたネットワーク データに対して文字列 "<!–" のマッチングを実行します。、モジュール 8 と 10 は両方とも、ファイルの読み取り失敗または一致の失敗のロジックであることを示す文字列「Error...」を出力します。モジュール 9 は、ファイルを正しく読み取った後のロジックです。
    ここに画像の説明を挿入します
    6) もう一度モジュール 9 を見てみましょう。al によって割り当てられた変数は、モジュール 3、4、5、および 6 の変数に非常に似ています。その後、それらがメモリ内の隣接するアドレスにあることがわかりました。前の分析に基づいて、これは配列であるはずだと推測しました。モジュール 9 は配列の 5 番目の文字であるはずです。
    ここに画像の説明を挿入します
    したがって、関数の他の文字パラメータは、取得されたネットワーク ファイルの 5 番目の文字になります。

  3. この関数の主なコード構造は何ですか?
    回答: switch ステートメント
    この関数を分析するにはグラフ モードを使用します IDA は、これが switch ステートメントであることを明確に分析しました。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

  4. この機能で何ができるのでしょうか?
    回答:指定されたフォルダーに悪意のあるファイルをコピーし、自己起動するようにレジストリを変更する可能性があります。
    1) スイッチ ジャンプ前の関数を解析します。関数に渡された文字 arg_0 がローカル変数 var_8 に割り当てられ、次に ecx に割り当てられます。その後、0x61h (実際には文字 "a") が減算され、スイッチ ジャンプは減算結果に基づいて実行されます。
    ここに画像の説明を挿入します
    2) 魔女のジャンプでは、左側が特定のジャンプ、右側がデフォルトのジャンプ (つまりデフォルト) であることが明確に区別できます。 3) 左側の特定の分岐の機能を分析します。 4) 最初

    ここに画像の説明を挿入します
    分岐CreateDirectoryA を呼び出し、指定されたパス フォルダー (C:\Temp) を作成します。
    ここに画像の説明を挿入します
    5) 2 番目のブランチは CopyFileA 関数を呼び出し、渡された 2 番目のパラメーター (このアプリケーションのファイル名) を使用します。これは、このブランチが指定されたパス (C: \Temp\cc.exe) を使用して、悪意のあるプログラム自体をコピーします。
    ここに画像の説明を挿入します
    6) 3 番目の分岐は関数 DeleteFileA を呼び出します。パラメータ (パス) は「C:\Temp\cc.exe」で、プログラムは指定されたプログラムを削除します。
    ここに画像の説明を挿入します
    7) 4 番目のブランチは、関数 RegOPenKeyExA および RegSetValueExA を呼び出します。その中の文字列に基づいて、このブランチがレジストリを変更し、悪意のあるプログラム (C:\Temp\cc.exe) を自己起動するように設定することを容易に判断できます。 。
    ここに画像の説明を挿入します
    8) 5 番目のブランチはスリープです。16 進数 0x186A0h の 10 進数値は 100000 で、100 秒間スリープすることを意味します。
    ここに画像の説明を挿入します

  5. この悪意のあるコードにはローカルな特徴があるのでしょうか?
    1) 登録スタートアップ項目が追加されるため、レジストリのキーと値。
    2) 指定したパスにあるファイル - 「C:\Temp\cc.exe」

  6. この悪意のあるコードの目的は何ですか?
    1) まず対象コンピュータのネットワーク状態を判断し、ネットワーク接続がない場合は直接プッシュする
    2) ネットワーク接続がある場合は指定された URL にリクエストを送信し、指定された Web ページを取得する 3)
    実行取得した Web ページのコンテンツに応じて、指定されたパスにプログラムを実行します。自己複製と自己起動の設定を行います。

Labs-06-4 実験

    怠け者でした~(*^_^*)~関連実験については
    iChunqiuyouのビデオチュートリアルを参照してください

おすすめ

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