PracticalMalwareAnalysis-Labs06 WriteUp

Practical Malware Analysis (by Michael Sikorski and Andrew Honig) Lab06のWriteUp。
まずは自分の解答を載せて、最後に模範解答を載せる。不正解の解答も戒めとしてそのまま載せる事とする。
ラボはこちらからダウンロード可能。

Lab 6-1

解析対象のファイルは以下の通り。

ファイル名ファイルの種類MD5ハッシュ値
Lab06-01.exe32ビット EXE6ABDE2F83015F066385D27CFF6143C44

1. What is the major code construct found in the only subroutine called by main?

main関数は恐らく0x401040。0x401040の中で呼び出されているサブルーチンは0x401000のみ。サブルーチン0x401000の冒頭でInternetGetConnectedStateが呼び出されており、戻り値に応じて2箇所あるジャンプ先のいずれかに処理が移る。これはif文と同義。

2. What is the subroutine located at 0x40105F?

サブルーチン0x40105Fの呼び出し直前にInternetGetConnectedStateでシステムのネットワークの接続状況を確認している。システムがネットワークに接続している場合はSuccess: Internet Connection\nというメッセージが、システムがネットワークに接続していない場合はError 1.1: No Internet\nというメッセージがサブルーチン0x40105Fに引数として渡される。恐らくサブルーチン0x40105Fはメッセージ出力のための関数と思われる。

.text:00401004 6A 00                   push    0               ; dwReserved
.text:00401006 6A 00                   push    0               ; lpdwFlags
.text:00401008 FF 15 B0 60 40 00       call    ds:InternetGetConnectedState
.text:0040100E 89 45 FC                mov     [ebp+var_4], eax
.text:00401011 83 7D FC 00             cmp     [ebp+var_4], 0
.text:00401015 74 14                   jz      short loc_40102B
---
.text:0040102B                         loc_40102B:
.text:0040102B 68 30 70 40 00          push    offset aError11NoInter ; "Error 1.1: No Internet\n"
.text:00401030 E8 2A 00 00 00          call    printf_40105F
.text:00401035 83 C4 04                add     esp, 4
.text:00401038 33 C0                   xor     eax, eax
---
.text:00401017 68 48 70 40 00          push    offset aSuccessInterne ; "Success: Internet Connection\n"
.text:0040101C E8 3E 00 00 00          call    printf_40105F
.text:00401021 83 C4 04                add     esp, 4
.text:00401024 B8 01 00 00 00          mov     eax, 1
.text:00401029 EB 0F                   jmp     short loc_40103A


3. What is the purpose of this program?

システムのネットワークの接続状況を確認し、システムがネットワークに接続している場合はSuccess: Internet Connection\nというメッセージを、システムがネットワークに接続していない場合はError 1.1: No Internet\nというメッセージを出力する。

Lab 6-2

解析対象のファイルは以下の通り。

ファイル名ファイルの種類MD5ハッシュ値
Lab06-02.exe32ビット EXEC0B54534E188E1392F28D17FAFF3D454

1. What operation does the first subroutine called by main perform?

main関数は恐らく0x401130。0x401130の中で最初に呼び出されているサブルーチンは0x401000。サブルーチン0x401000はInternetGetConnectedStateでシステムのネットワークの接続状況を確認し、システムがネットワークに接続している場合はSuccess: Internet Connection\nというメッセージを、システムがネットワークに接続していない場合はError 1.1: No Internet\nというメッセージを出力する。

2. What is the subroutine located at 0x40117F?

サブルーチン0x40117Fは合計6回呼び出されており、以下のメッセージを引数として受け取っている。

  • "Success: Internet Connection\n"
  • "Error 1.1: No Internet\n"
  • "Error 2.1: Fail to OpenUrl\n"
  • "Error 2.2: Fail to ReadFile\n"
  • "Error 2.3: Fail to get command\n"
  • "Success: Parsed command is %c\n"

よってサブルーチン0x40117Fはメッセージ出力のための関数と思われる。

3. What does the second subroutine called by main do?

main関数の中で2番目に呼び出されているサブルーチンは0x401040。サブルーチン 0x401040は、まずURL http://www.practicalmalwareanalysis[.]com/cc.htmへの通信を試みる。この際ユーザーエージェントにInternet Explorer 7.5/pmaを用いる。

.text:00401051 68 F4 70 40 00          push    offset szAgent  ; "Internet Explorer 7.5/pma"
.text:00401056 FF 15 C4 60 40 00       call    ds:InternetOpenA
.text:0040105C 89 45 F4                mov     [ebp+hInternet], eax
.text:0040105F 6A 00                   push    0               ; dwContext
.text:00401061 6A 00                   push    0               ; dwFlags
.text:00401063 6A 00                   push    0               ; dwHeadersLength
.text:00401065 6A 00                   push    0               ; lpszHeaders
.text:00401067 68 C4 70 40 00          push    offset szUrl    ; "http://www.practicalmalwareanalysis.com"...
.text:0040106C 8B 45 F4                mov     eax, [ebp+hInternet]
.text:0040106F 50                      push    eax             ; hInternet
.text:00401070 FF 15 B4 60 40 00       call    ds:InternetOpenUrlA
.text:00401076 89 45 F0                mov     [ebp+hFile], eax
.text:00401079 83 7D F0 00             cmp     [ebp+hFile], 0
.text:0040107D 75 1E                   jnz     short loc_40109D

URLへの通信が失敗した場合は"Error 2.1: Fail to OpenUrl\n"というメッセージを出力して接続を終了する。

.text:0040107F 68 A8 70 40 00          push    offset aError21FailToO ; "Error 2.1: Fail to OpenUrl\n"
.text:00401084 E8 F6 00 00 00          call    printf_40117F
.text:00401089 83 C4 04                add     esp, 4
.text:0040108C 8B 4D F4                mov     ecx, [ebp+hInternet]
.text:0040108F 51                      push    ecx             ; hInternet
.text:00401090 FF 15 B8 60 40 00       call    ds:InternetCloseHandle
.text:00401096 32 C0                   xor     al, al
.text:00401098 E9 8F 00 00 00          jmp     loc_40112C

URLへの通信が成功した場合はレスポンスのデータを読み込む。

.text:0040109D 8D 55 F8                lea     edx, [ebp+dwNumberOfBytesRead]
.text:004010A0 52                      push    edx             ; lpdwNumberOfBytesRead
.text:004010A1 68 00 02 00 00          push    200h            ; dwNumberOfBytesToRead
.text:004010A6 8D 85 F0 FD FF FF       lea     eax, [ebp+Buffer]
.text:004010AC 50                      push    eax             ; lpBuffer
.text:004010AD 8B 4D F0                mov     ecx, [ebp+hFile]
.text:004010B0 51                      push    ecx             ; hFile
.text:004010B1 FF 15 BC 60 40 00       call    ds:InternetReadFile
.text:004010B7 89 45 FC                mov     [ebp+var_4], eax
.text:004010BA 83 7D FC 00             cmp     [ebp+var_4], 0
.text:004010BE 75 25                   jnz     short loc_4010E5

レスポンスのデータの読み込みに失敗した場合は"Error 2.2: Fail to ReadFile\n"というメッセージを出力して接続を終了する。

.text:004010C0 68 88 70 40 00          push    offset aError22FailToR ; "Error 2.2: Fail to ReadFile\n"
.text:004010C5 E8 B5 00 00 00          call    printf_40117F
.text:004010CA 83 C4 04                add     esp, 4
.text:004010CD 8B 55 F4                mov     edx, [ebp+hInternet]
.text:004010D0 52                      push    edx             ; hInternet
.text:004010D1 FF 15 B8 60 40 00       call    ds:InternetCloseHandle
.text:004010D7 8B 45 F0                mov     eax, [ebp+hFile]
.text:004010DA 50                      push    eax             ; hInternet
.text:004010DB FF 15 B8 60 40 00       call    ds:InternetCloseHandle
.text:004010E1 32 C0                   xor     al, al
.text:004010E3 EB 47                   jmp     short loc_40112C

レスポンスのデータの読み込みに成功した場合はレスポンス・データの先頭に<!--という文字列があるか確認する。<!--が無かった場合は"Error 2.3: Fail to get command\n"というメッセージを出力して処理を終了する。

.text:004010E5 0F BE 8D F0 FD FF FF    movsx   ecx, [ebp+Buffer]
.text:004010EC 83 F9 3C                cmp     ecx, '<'
.text:004010EF 75 2C                   jnz     short loc_40111D
---
.text:004010F1 0F BE 95 F1 FD FF FF    movsx   edx, [ebp+var_20F]
.text:004010F8 83 FA 21                cmp     edx, '!'
.text:004010FB 75 20                   jnz     short loc_40111D
---
.text:004010FD 0F BE 85 F2 FD FF FF    movsx   eax, [ebp+var_20E]
.text:00401104 83 F8 2D                cmp     eax, '-'
.text:00401107 75 14                   jnz     short loc_40111D
---
.text:00401109 0F BE 8D F3 FD FF FF    movsx   ecx, [ebp+var_20D]
.text:00401110 83 F9 2D                cmp     ecx, '-'
.text:00401113 75 08                   jnz     short loc_40111D
---
.text:0040111D                         loc_40111D:
.text:0040111D 68 68 70 40 00          push    offset aError23FailToG ; "Error 2.3: Fail to get command\n"
.text:00401122 E8 58 00 00 00          call    printf_40117F
.text:00401127 83 C4 04                add     esp, 4
.text:0040112A 32 C0                   xor     al, al

レスポンス・データの先頭に<!--という文字列が確認できた場合は<!--直後のデータをalレジスタに格納して処理を終了する。

.text:00401115 8A 85 F4 FD FF FF       mov     al, [ebp+var_20C]
.text:0040111B EB 0F                   jmp     short loc_40112C

まとめるとサブルーチン 0x401040はC2 URL http://www.practicalmalwareanalysis[.]com/cc.htmと通信を行い、レスポンス・データの中からコマンドをパースする関数と推測できる。コマンドはHTMLコメントタグ<!--の中に埋め込まれていると思われる。

4. What type of code construct is used in this subroutine?

ネストされたif文と同義。

5. Are there any network-based indicators for this program?

  • URL http://www.practicalmalwareanalysis[.]com/cc.htm
  • ユーザーエージェント Internet Explorer 7.5/pma


6. What is the purpose of this malware?

システムのネットワークの接続状況を確認し、システムがネットワークに接続している場合はSuccess: Internet Connection\nというメッセージを、システムがネットワークに接続していない場合はError 1.1: No Internet\nというメッセージを出力する。
システムがネットワークに接続している場合は、C2 URL http://www.practicalmalwareanalysis[.]com/cc.htmと通信を行い、レスポンス・データの中からコマンドをパースする。コマンドはHTMLコメントタグ<!--の中に埋め込まれている。コマンドのパースに成功した場合はSuccess: Parsed command isというメッセージとともにパースしたコマンドを出力して60秒間スリープする。

.text:00401148 E8 F3 FE FF FF          call    GetC2Command_401040
.text:0040114D 88 45 F8                mov     [ebp+var_8], al
.text:00401150 0F BE 45 F8             movsx   eax, [ebp+var_8]
.text:00401154 85 C0                   test    eax, eax
.text:00401156 75 04                   jnz     short loc_40115C
---
.text:0040115C 0F BE 4D F8             movsx   ecx, [ebp+var_8]
.text:00401160 51                      push    ecx
.text:00401161 68 10 71 40 00          push    offset aSuccessParsedC ; "Success: Parsed command is %c\n"
.text:00401166 E8 14 00 00 00          call    printf_40117F
.text:0040116B 83 C4 08                add     esp, 8
.text:0040116E 68 60 EA 00 00          push    60000           ; dwMilliseconds
.text:00401173 FF 15 00 60 40 00       call    ds:Sleep
.text:00401179 33 C0                   xor     eax, eax

Lab 6-3

解析対象のファイルは以下の通り。

ファイル名ファイルの種類MD5ハッシュ値
Lab06-03.exe32ビット EXE3F8E2B945DEBA235FA4888682BD0D640

1. Compare the calls in main to Lab 6-2's main method. What is the new function called from main?

main関数は恐らく0x401210。0x401210の中では新たにサブルーチン0x401130が呼び出されている。

2. What parameters does this new function take?

ファイル名およびC2サーバーのレスポンスからパースしたC2コマンドを引数として受け取る。

.text:0040123C 0F BE 4D F8             movsx   ecx, [ebp+C2Command]
.text:00401240 51                      push    ecx
.text:00401241 68 B8 71 40 00          push    offset aSuccessParsedC ; "Success: Parsed command is %c\n"
.text:00401246 E8 26 00 00 00          call    printf_401271
.text:0040124B 83 C4 08                add     esp, 8
.text:0040124E 8B 55 0C                mov     edx, [ebp+arg_4]
.text:00401251 8B 02                   mov     eax, [edx]
.text:00401253 50                      push    eax             ; lpExistingFileName
.text:00401254 8A 4D F8                mov     cl, [ebp+C2Command]
.text:00401257 51                      push    ecx             ; char
.text:00401258 E8 D3 FE FF FF          call    sub_401130

3. What major code construct does this function contain?

switch文

4. What can this function do?

まず引数に渡されたC2コマンドの値を確認する。

.text:00401130 55                      push    ebp
.text:00401131 8B EC                   mov     ebp, esp
.text:00401133 83 EC 08                sub     esp, 8
.text:00401136 0F BE 45 08             movsx   eax, [ebp+arg_0] ; C2 command
.text:0040113A 89 45 F8                mov     [ebp+C2Command], eax
.text:0040113D 8B 4D F8                mov     ecx, [ebp+C2Command]
.text:00401140 83 E9 61                sub     ecx, 61h
.text:00401143 89 4D F8                mov     [ebp+C2Command], ecx
.text:00401146 83 7D F8 04             cmp     [ebp+C2Command], 4 ; switch 5 cases
.text:0040114A 0F 87 91 00 00 00       ja      loc_4011E1      ; jumptable 00401153 default case

C2コマンドの値が4より大きい場合は'Error 3.2: Not a valid command provided'というメッセージを出力して処理を終了する。

.text:004011E1                         loc_4011E1:             ; 'Error 3.2: Not a valid command provided'
.text:004011E1 68 10 71 40 00          push    offset aError32NotAVal
.text:004011E6 E8 86 00 00 00          call    printf_401271
.text:004011EB 83 C4 04                add     esp, 4

C2コマンドの値が0の場合、マルウェアはC:\Tempというディレクトリを作成する。

.text:0040115A                         loc_40115A:             ; jumptable 00401153 case 0
.text:0040115A 6A 00                   push    0
.text:0040115C 68 B0 71 40 00          push    offset PathName ; "C:\\Temp"
.text:00401161 FF 15 0C 60 40 00       call    ds:CreateDirectoryA
.text:00401167 E9 82 00 00 00          jmp     loc_4011EE

C2コマンドの値が1の場合、マルウェアは自身のコピーをC:\Temp\cc.exeとして作成する。

.text:0040116C                         loc_40116C:             ; jumptable 00401153 case 1
.text:0040116C 6A 01                   push    1
.text:0040116E 68 A0 71 40 00          push    offset Data     ; "C:\\Temp\\cc.exe"
.text:00401173 8B 45 0C                mov     eax, [ebp+lpExistingFileName]
.text:00401176 50                      push    eax             ; lpExistingFileName
.text:00401177 FF 15 14 60 40 00       call    ds:CopyFileA
.text:0040117D EB 6F                   jmp     short loc_4011EE

C2コマンドの値が2の場合、マルウェアはファイル C:\Temp\cc.exeを削除する。

.text:0040117F                         loc_40117F:             ; jumptable 00401153 case 2
.text:0040117F 68 A0 71 40 00          push    offset Data     ; 'C:\Temp\cc.exe'
.text:00401184 FF 15 28 60 40 00       call    ds:DeleteFileA
.text:0040118A EB 62                   jmp     short loc_4011EE

C2コマンドの値が3の場合、マルウェアはレジストリキー HKLM\Software\Microsoft\Windows\CurrentVersion\Run\Malwareにファイル C:\Temp\cc.exeを登録する。Runキーによる永続化を図っている。

.text:0040118C                         loc_40118C:             ; jumptable 00401153 case 3
.text:0040118C 8D 4D FC                lea     ecx, [ebp+phkResult]
.text:0040118F 51                      push    ecx             ; phkResult
.text:00401190 68 3F 00 0F 00          push    0F003Fh         ; samDesired
.text:00401195 6A 00                   push    0               ; ulOptions
.text:00401197 68 70 71 40 00          push    offset SubKey   ; "Software\\Microsoft\\Windows\\CurrentVe"...
.text:0040119C 68 02 00 00 80          push    80000002h       ; hKey
.text:004011A1 FF 15 04 60 40 00       call    ds:RegOpenKeyExA
.text:004011A7 6A 0F                   push    0Fh             ; cbData
.text:004011A9 68 A0 71 40 00          push    offset Data     ; "C:\\Temp\\cc.exe"
.text:004011AE 6A 01                   push    1               ; dwType
.text:004011B0 6A 00                   push    0               ; Reserved
.text:004011B2 68 68 71 40 00          push    offset ValueName ; "Malware"
.text:004011B7 8B 55 FC                mov     edx, [ebp+phkResult]
.text:004011BA 52                      push    edx             ; hKey
.text:004011BB FF 15 00 60 40 00       call    ds:RegSetValueExA
.text:004011C1 85 C0                   test    eax, eax
.text:004011C3 74 0D                   jz      short loc_4011D2

C2コマンドの値が4の場合、マルウェアは100秒間スリープする。

.text:004011D4                         loc_4011D4:             ; jumptable 00401153 case 4
.text:004011D4 68 A0 86 01 00          push    100000
.text:004011D9 FF 15 30 60 40 00       call    ds:Slee
.text:004011DF EB 0D                   jmp     short loc_4011EE

5. Are there any host-based indicators for this malware?

  • ディレクトリ名 C:\Temp
  • ファイル名 C:\Temp\cc.exe
  • レジストリキー HKLM\Software\Microsoft\Windows\CurrentVersion\Run\Malware


6. What is the purpose of this malware?

システムのネットワークの接続状況を確認し、システムがネットワークに接続している場合はSuccess: Internet Connection\nというメッセージを、システムがネットワークに接続していない場合はError 1.1: No Internet\nというメッセージを出力する。

システムがネットワークに接続している場合は、C2 URL http://www.practicalmalwareanalysis[.]com/cc.htmと通信を行い、レスポンス・データの中からコマンドをパースする。コマンドはHTMLコメントタグ<!--の中に埋め込まれている。コマンドのパースに成功した場合はSuccess: Parsed command isというメッセージとともにパースしたコマンドを出力する。

パースしたC2コマンドの値 (0-4)に応じてファイル C:\Temp\cc.exe (自身のコピー) の作成・削除をしたり、ディレクトリ C:\Tempを作成したり、Runレジストリキー HKLM\Software\Microsoft\Windows\CurrentVersion\Run\Malwareに自身 (C:\Temp\cc.exe)を登録して永続化を図ったり、あるいは100秒間スリープしたりする。コマンドの実行後、60秒間スリープする。

Lab 6-4

解析対象のファイルは以下の通り。

ファイル名ファイルの種類MD5ハッシュ値
Lab06-04.exe32ビット EXE21BE74DFAFDACAAAB1C8D836E2186A69

1. What is the difference between the calls made from the main method in Labs 6-3 and 6-4?

main関数は恐らく0x401230。サブルーチン0x401000でネットワーク接続状況の確認をしたあとに、for ループが追加されている。


.text:00401248                         loc_401248:
.text:00401248 C7 45 F4 00 00 00 00    mov     [ebp+counter], 0
.text:0040124F EB 09                   jmp     short loc_40125A
---
.text:0040125A                         loc_40125A:
.text:0040125A 81 7D F4 A0 05 00 00    cmp     [ebp+counter], 1440
.text:00401261 7D 4C                   jge     short loc_4012AF


2. What new code construct has been added to main?

for ループ。ループ・カウンターの値が1440未満の場合は繰り返しC2 URLからC2コマンドを取得して実行する。C2コマンドを1回実行するごとに60秒間スリープし、ループ・カウンターの値を加算する。ループ・カウンターの値が1440以上に達すると処理を終了する。

.text:00401248 C7 45 F4 00 00 00 00    mov     [ebp+counter], 0
.text:0040124F EB 09                   jmp     short loc_40125A
---
.text:0040125A                         loc_40125A:
.text:0040125A 81 7D F4 A0 05 00 00    cmp     [ebp+counter], 1440
.text:00401261 7D 4C                   jge     short loc_4012AF
---
.text:00401263 8B 4D F4                mov     ecx, [ebp+counter]
.text:00401266 51                      push    ecx
.text:00401267 E8 D4 FD FF FF          call    GetC2Command_401040
.text:0040126C 83 C4 04                add     esp, 4
.text:0040126F 88 45 F8                mov     [ebp+var_8], al
.text:00401272 0F BE 55 F8             movsx   edx, [ebp+var_8]
.text:00401276 85 D2                   test    edx, edx
.text:00401278 75 04                   jnz     short loc_40127E
---
.text:0040127E 0F BE 45 F8             movsx   eax, [ebp+var_8]
.text:00401282 50                      push    eax
.text:00401283 68 BC 71 40 00          push    offset aSuccessParsedC ; "Success: Parsed command is %c\n"
.text:00401288 E8 28 00 00 00          call    printf_4012B5
.text:0040128D 83 C4 08                add     esp, 8
.text:00401290 8B 4D 0C                mov     ecx, [ebp+arg_4]
.text:00401293 8B 11                   mov     edx, [ecx]
.text:00401295 52                      push    edx             ; lpExistingFileName
.text:00401296 8A 45 F8                mov     al, [ebp+var_8]
.text:00401299 50                      push    eax             ; char
.text:0040129A E8 B1 FE FF FF          call    ExecC2Command_401150
.text:0040129F 83 C4 08                add     esp, 8
.text:004012A2 68 60 EA 00 00          push    60000           ; dwMilliseconds
.text:004012A7 FF 15 30 60 40 00       call    ds:Sleep
.text:004012AD EB A2                   jmp     short loc_401251
---
.text:00401251                         loc_401251:
.text:00401251 8B 45 F4                mov     eax, [ebp+counter]
.text:00401254 83 C0 01                add     eax, 1
.text:00401257 89 45 F4                mov     [ebp+counter], eax


3. What is the difference between this lab's parse HTML function and those of the previous labs?

先のラボと異なり、C2コマンド取得のためのサブルーチン 0x401040はループ・カウンタの値を引数として受け取っている。

.text:00401263 8B 4D F4                mov     ecx, [ebp+counter]
.text:00401266 51                      push    ecx
.text:00401267 E8 D4 FD FF FF          call    GetC2Command_401040

また、C2 URL http://www.practicalmalwareanalysis[.]com/cc.htm へ通信する際に用いるユーザーエージェントがInternet Explorer 7.5/pmaからInternet Explorer 7.50/pmaに変化しており、通信の際にループ・カウンタの値をユーザーエージェントに埋め込む。

.text:00401040 55                      push    ebp
.text:00401041 8B EC                   mov     ebp, esp
.text:00401043 81 EC 30 02 00 00       sub     esp, 230h
.text:00401049 8B 45 08                mov     eax, [ebp+arg_0] ; copy loop counter to eax
.text:0040104C 50                      push    eax
.text:0040104D 68 F4 70 40 00          push    offset aInternetExplor ; "Internet Explorer 7.50/pma%d"
.text:00401052 8D 4D D8                lea     ecx, [ebp+szAgent]
.text:00401055 51                      push    ecx
.text:00401056 E8 8B 02 00 00          call    sprintf_4012E6
.text:0040105B 83 C4 0C                add     esp, 0Ch
.text:0040105E 6A 00                   push    0               ; dwFlags
.text:00401060 6A 00                   push    0               ; lpszProxyBypass
.text:00401062 6A 00                   push    0               ; lpszProxy
.text:00401064 6A 00                   push    0               ; dwAccessType
.text:00401066 8D 55 D8                lea     edx, [ebp+szAgent]
.text:00401069 52                      push    edx             ; lpszAgent
.text:0040106A FF 15 DC 60 40 00       call    ds:InternetOpenA
.text:00401070 89 45 D4                mov     [ebp+hInternet], eax
.text:00401073 6A 00                   push    0               ; dwContext
.text:00401075 6A 00                   push    0               ; dwFlags
.text:00401077 6A 00                   push    0               ; dwHeadersLength
.text:00401079 6A 00                   push    0               ; lpszHeaders
.text:0040107B 68 C4 70 40 00          push    offset szUrl    ; "http://www.practicalmalwareanalysis.com"...
.text:00401080 8B 45 D4                mov     eax, [ebp+hInternet]
.text:00401083 50                      push    eax             ; hInternet
.text:00401084 FF 15 CC 60 40 00       call    ds:InternetOpenUrlA
.text:0040108A 89 45 D0                mov     [ebp+hFile], eax
.text:0040108D 83 7D D0 00             cmp     [ebp+hFile], 0
.text:00401091 75 1E                   jnz     short loc_4010B1


4. How long will this program run? (Assume that it is connected to the Internet.)

このマルウェアはC2 URLからコマンドを取得して実行するごとに60秒間スリープして、それを1440回繰り返す。

60 x 1440 = 86400秒 (24時間)

5. Are there any new network-based indicators for this malware?

  • ユーザーエージェント Internet Explorer 7.50/pma + (ループ・カウンターの値)


6. What is the purpose of this malware?

システムのネットワークの接続状況を確認し、システムがネットワークに接続している場合はSuccess: Internet Connection\nというメッセージを、システムがネットワークに接続していない場合はError 1.1: No Internet\nというメッセージを出力する。

システムがネットワークに接続している場合は、C2 URL http://www.practicalmalwareanalysis[.]com/cc.htmと通信を行い、レスポンス・データの中からコマンドをパースする。コマンドはHTMLコメントタグ<!--の中に埋め込まれている。コマンドのパースに成功した場合はSuccess: Parsed command isというメッセージとともにパースしたコマンドを出力する。

パースしたC2コマンドの値 (0-4)に応じてファイル C:\Temp\cc.exe (自身のコピー) の作成・削除をしたり、ディレクトリ C:\Tempを作成したり、Runレジストリキー HKLM\Software\Microsoft\Windows\CurrentVersion\Run\Malwareに自身 (C:\Temp\cc.exe)を登録して永続化を図ったり、あるいは100秒間スリープしたりする。コマンドの実行後は60秒間スリープした後、再びC2 URLとの通信を行う。C2 URLとの通信は86400秒間 (24時間)に達するまで繰り返される (C2 URL からスリープ命令を受け取らなかったと仮定した場合)。

模範解答

Lab 6-1

1. The major code construct is an if statement located at 0x401000

2. printf is the subroutine located at 0x40105F.

3. The program checks for an active Internet connection. If an active connection is found, it prints "Success: Internet Connection." If a connection is not found, it prints "Error 1.1: No Internet." This program can be used by malware to check for a connection before attempting to connect to the Internet.

Lab 6-2

1. The first subroutine at 0x401000 is the same as in Lab 6-1. It's an if statement that checks for an active Internet connection.

2. printf is the subroutine located at 0x40117F.

3. The second function called from main is located at 0x401040. It downloads the web page located at http://www.practicalmalwareanalysis[.]com/cc.htm and parses HTML comment from the beginning of the page.

4. This subroutine uses a character array filled with data from the call to InternetReadFile. This array is compared one byte at a time to parse an HTML comment.

5. There are two network-based indicators. The program uses the HTTP User-Agent Internet Explorer 7.5/pma and downloads the web page located at: http://www.practicalmalwareanalysis[.]com/cc.htm.

6. First, the program checks for an active Internet connection. If none is found, the program terminates. Otherwise, the program attempts to download a web page using a unique User-Agent. This web page contains an embedded HTML comment starting with <!--. The next character is parsed from this comment and printed to the screen in the format "Success: Parsed command is X," where X is the character parsed from the HTML comment. If successful, the program will sleep for 1 minute and then terminate.

Lab 6-3

1. The functions at 0x401000 and 0x401040 are the same as those in Lab 6-2. At 0x401271 is printf. The 0x401130 function is new to this lab.

2. The new function takes two parameters. The first is the command character parsed from the HTML comment, and the second is the program name argv[0], the standard main parameter.

3. The new function contains a switch statement with a jump table.

4. The new function can print error messages, delete a file, create a directory, set a registry value, copy a file, or sleep for 100 seconds.

5. The registry key Software\Microsoft\Windows\CurrentVersion\Run\Malware and the file location C:\Temp\cc.exe can both be host-based indicators.

6. The program first checks for an active Internet connection. If no Internet connection is found, the program terminates. Otherwise, the program will attempt to download a web page containing an embedded HTML comment beginning with <!--. The first character of the comment is parsed and used in a switch statement to determine which action to take on the local system, including whether to delete a file, create a directory, set a registry run key, copy a file, or sleep for 100 seconds.

Lab 6-4

1. The function at 0x401000 is the check Internet connection method, 0x401040 is the parse HTML method, 0x4012B5 is printf, and 0x401150 is the switch statement.

2. A for loop has been added to the main method.

3. The function at 0x401040 now takes a parameter and calls sprintf with the format string Internet Explorer 7.50%d. It builds a User-Agent for use during HTTP communication using the argument passed in.

4. This program will run for 1440 minutes (24hours).

5. Yes, a new User-Agent is used. It takes the form Internet Explorer 7.50/pma%d, where %d is the number of minutes the program has been running.

6. First, the program checks for an active Internet connection. If none is found, the program terminates. Otherwise, the program will use a unique User-Agent to attempt to download a web page containing a counter that tracts the number of minutes the program has been running. The web page downloaded contains an embedded HTML comment starting with <!--. The next character is parsed from this comment and used in a switch statement to determine the action to take on the local system. These are hard-coded actions, including deleting a file, creating a directory, setting a registry run key, copying a file, and sleeping for 100 seconds. This program will run for 24 hours before terminating.

答え合わせ

Lab 6-3 問4にてC2 URLのレスポンス・データから取得されるC2コマンドの値は数字の0-4から成ると解答したが、これは誤りだった。正しくはC2コマンドの値はアルファベットのa、b、c、d、eから成る。
サブルーチン0x401150冒頭の以下のコードに注目してみる。

.text:00401130 55                      push    ebp
.text:00401131 8B EC                   mov     ebp, esp
.text:00401133 83 EC 08                sub     esp, 8
.text:00401136 0F BE 45 08             movsx   eax, [ebp+arg_0] ; C2 command
.text:0040113A 89 45 F8                mov     [ebp+C2Command], eax
.text:0040113D 8B 4D F8                mov     ecx, [ebp+C2Command]
.text:00401140 83 E9 61                sub     ecx, 61h
.text:00401143 89 4D F8                mov     [ebp+C2Command], ecx
.text:00401146 83 7D F8 04             cmp     [ebp+C2Command], 4 ; switch 5 cases
.text:0040114A 0F 87 91 00 00 00       ja      loc_4011E1      ; jumptable 00401153 default case

上記のコードは引数に渡されたC2コマンド (1バイト)をECXレジスタに格納した後、ECXに格納した値から0x61を減算している。0x61をhexデコードするとアルファベットのaになる。その後、 ECX - 0x61の差が4より大きいか比較している。

  • C2コマンドの値が0x61 (a) と等しかった場合、ECX - 0x61の差は0となり、ディレクトリ C:\Temp 作成の処理へ飛ぶ
  • C2コマンドの値が0x62 (b) と等しかった場合、ECX - 0x61の差は1となり、ファイル C:\Temp\cc.exe 作成の処理へ飛ぶ
  • C2コマンドの値が0x63 (c) と等しかった場合、ECX - 0x61の差は2となり、ファイル C:\Temp\cc.exe 削除の処理へ飛ぶ
  • C2コマンドの値が0x64 (d) と等しかった場合、ECX - 0x61の差は3となり、Run レジストリキー作成の処理へ飛ぶ
  • C2コマンドの値が0x65 (e) と等しかった場合、ECX - 0x61の差は4となり、スリープ処理へ飛ぶ
  • C2コマンドの値が0x65 (e) よりも大きかった場合、ECX - 0x61の差は4より大きくなり、Error 3.2: Not a valid command provided というメッセージを出力して処理を終了する


上記の処理への分岐にはジャンプ・テーブルが用いられている。以下のコードに注目してみる。

.text:00401150 8B 55 F8                mov     edx, [ebp+C2Command]
.text:00401153 FF 24 95 F2 11 40 00    jmp     ds:off_4011F2[edx*4] ; switch jump

上述したECX - 0x61の差の値がEDXレジスタに格納されてジャンプ・テーブル 0x4011F2のインデックスとして用いられる。EDXの値に4が掛けられているが、これはジャンプ・テーブルのエントリーがアドレス 0x4011F2からの各アドレス(4バイト毎)に格納されているためである。

以下はジャンプ・テーブル 0x4011F2の内容である。

.text:004011F2 off_4011F2                   dd offset loc_40115A    ; DATA XREF: ExecC2Command_401130+23↑r
.text:004011F2 "(0x4011F6)"                 dd offset loc_40116C    ; jump table for switch statement
.text:004011F2 "(0x4011FA)"                 dd offset loc_40117F
.text:004011F2 "(0x401204)"                 dd offset loc_40118C
.text:004011F2 "(0x401208)"                 dd offset loc_4011D4
  • 0x4011F2[0] (0x4011F2) にはアドレス 0x40115Aが格納されている
  • 0x4011F2[1] (0x4011F6) にはアドレス 0x40116Cが格納されている
  • 0x4011F2[2] (0x4011FA) にはアドレス 0x40117Fが格納されている
  • 0x4011F2[3] (0x401204) にはアドレス 0x40118Cが格納されている
  • 0x4011F2[4] (0x401208) にはアドレス 0x4011D4が格納されている

Leave a Reply

Your email address will not be published. Required fields are marked *