SANSからの練習問題を試す ファイルの取り出し (5)
Volatiliry 以外のツールを使って、APT.IMG のメモリイメージ内からファイルの取り出しについても考えていきたいと思います。
カービングする方法もありますが、まずは bulk_extractor を使ってみたいと思いますので、ここでは Windows 版の bulk_extractor に APT.IMG を読み込んで処理を実行してみます。オプションはデフォルトに Wordlist だけ追加でチェックをつけています。
実行結果を確認してみたいと思いますが、実行ファイルに関連した情報は、winpe.txt に出力されています。2,693件のレコードが出力されてきました、一部だけ抜粋してみます。テキストエディタなどで開いて見ていくのは面倒そうですから、ビューアを使った方がいいかもしれません。
737288 b156dd7eaf7056145b770da4932fbb7<PE><FileHeader Machine="IMAGE_FILE_MACHINE_I386" NumberOfSections="5" TimeDateStamp="1239889739" PointerToSymbolTable="0" NumberOfSymbols="0" SizeOfOptionalHeader="224"><Characteristics><IMAGE_FILE_EXECUTABLE_IMAGE /><IMAGE_FILE_32BIT_MACHINE /><IMAGE_FILE_DLL /></Characteristics></FileHeader><OptionalHeaderStandard Magic="PE32" MajorLinkerVersion="8" MinorLinkerVersion="0" SizeOfCode="73728" SizeOfInitializedData="40960" SizeOfUninitializedData="0" AddressOfEntryPoint="0x91c9" BaseOfCode="0x1000" /><OptionalHeaderWindows ImageBase="0x10000000" SectionAlignment="1000" FileAlignment="1000" MajorOperatingSystemVersion="4" MinorOperatingSystemVersion="0" MajorImageVersion="0" MinorImageVersion="0" MajorSubsystemVersion="4" MinorSubsystemVersion="0" Win32VersionValue="0" SizeOfImage="1d000" SizeOfHeaders="1000" CheckSum="0x228db" SubSystem="" SizeOfStackReserve="100000" SizeOfStackCommit="1000" SizeOfHeapReserve="100000" SizeOfHeapCommit="1000" LoaderFlags="0" NumberOfRvaAndSizes="10"><DllCharacteristics></DllCharacteristics></OptionalHeaderWindows><Sections><SectionHeader Name=".text" VirtualSize="1162d" VirtualAddress="1000" SizeOfRawData="12000" PointerToRawData="1000" PointerToRelocations="0" PointerToLinenumbers="0" ><Characteristics><IMAGE_SCN_CNT_CODE /><IMAGE_SCN_MEM_EXECUTE /><IMAGE_SCN_MEM_READ /></Characteristics></SectionHeader><SectionHeader Name=".rdata" VirtualSize="3d34" VirtualAddress="13000" SizeOfRawData="4000" PointerToRawData="13000" PointerToRelocations="0" PointerToLinenumbers="0" ><Characteristics><IMAGE_SCN_CNT_INITIALIZED_DATA /><IMAGE_SCN_MEM_READ /></Characteristics></SectionHeader><SectionHeader Name=".data" VirtualSize="2d04" VirtualAddress="17000" SizeOfRawData="2000" PointerToRawData="17000" PointerToRelocations="0" PointerToLinenumbers="0" ><Characteristics><IMAGE_SCN_CNT_INITIALIZED_DATA /><IMAGE_SCN_MEM_READ /><IMAGE_SCN_MEM_WRITE /></Characteristics></SectionHeader><SectionHeader Name=".rsrc" VirtualSize="3c0" VirtualAddress="1a000" SizeOfRawData="1000" PointerToRawData="19000" PointerToRelocations="0" PointerToLinenumbers="0" ><Characteristics><IMAGE_SCN_CNT_INITIALIZED_DATA /><IMAGE_SCN_MEM_READ /></Characteristics></SectionHeader><SectionHeader Name=".reloc" VirtualSize="1a06" VirtualAddress="1b000" SizeOfRawData="2000" PointerToRawData="1a000" PointerToRelocations="0" PointerToLinenumbers="0" ><Characteristics><IMAGE_SCN_CNT_INITIALIZED_DATA /><IMAGE_SCN_MEM_DISCARDABLE /><IMAGE_SCN_MEM_READ /></Characteristics></SectionHeader></Sections><dlls></dlls></PE>
2,693件のレコードが出力されていますが、これらのEXEのファイル名が分かりません。
ファイルシステムの場合には identify_filenames.py を使うことでファイル名を探すこともできるようですが、メモリイメージだけの場合にはどうすれば良いのでしょうかね?
bulk_extractor の出力結果には、データ内でのオフセット位置が記録されています、先ほどの引用部分ですと、737288 がオフセット位置という事になります。16進数では0xB4008 になるかと思います。
さて、Volatility の出力結果なりと bulk_extractor の結果を付き合わせて見ていくにはどうすれば良いのかが気になります。
例えば、bulk_extractor のバイトオフセット位置がメモリイメージ内の物理または仮想アドレスのどの位置となるのかをマッピングする事が可能か?という事になるかと思います。
Volatility の出力結果ですが、pslist のデフォルトは仮想アドレスの表示ですが、-P オプションを付けることで物理アドレスが出力できるとあります。
Offset(P) Name PID PPID Thds Hnds Sess Wow64 Start Exit
---------- -------------------- ------ ------ ------ -------- ------ ------ ------------------------------ ------------------------------
0x01fbdda0 iexplore.exe 796 884 8 152 0 0 2009-05-05 19:28:28 UTC+0000
PID 796 iexplore.exe の物理アドレスは 0x01fbdda0 で 10進数では 33283488 という事になります。この値を winpe.txt で検索してみますと、残念見つかりません(笑)実際にAPT.IMGの該当オフセット位置 33283488 を見ても MZ など見当たりません。
イヤイヤ、そんな単純なお話ではない!!という事だとは思いますが、Volatilityの参考資料なども見つつ、もう少し調べてみる必要があるようです。
http://computer.forensikblog.de/en/2006/04/reconstructing-a-binary-1.html
Volatilityで ImageBaseAddress を知るにはどうすればいいんですかね?と思い検索してみると、procexedump で ImageBase の値が得られるようです。
>vola.exe -f APT.img --profile=WinXPSP3x86 procexedump -D procout
Volatility Foundation Volatility Framework 2.3.1
Process(V) ImageBase Name Result
---------- ---------- -------------------- ------
0x823c8830 ---------- System Error: PEB at 0x0 is paged
0x8230aad8 0x48580000 smss.exe OK: executable.564.exe
0x822ca2c0 0x4a680000 csrss.exe OK: executable.636.exe
0x81f63020 0x01000000 winlogon.exe OK: executable.660.exe
0x81f22020 0x01000000 services.exe OK: executable.704.exe
0x82164da0 0x01000000 lsass.exe Error: ImageBaseAddress at 0x1000000
is paged
0x822cb458 0x00400000 vmacthlp.exe OK: executable.872.exe
0x81e54da0 0x01000000 svchost.exe OK: executable.884.exe
0x81da4590 0x01000000 svchost.exe OK: executable.968.exe
0x81f739b0 0x01000000 svchost.exe OK: executable.1088.exe
0x8232c020 0x01000000 svchost.exe OK: executable.1140.exe
0x81e91da0 0x01000000 svchost.exe OK: executable.1212.exe
0x8219b630 0x01000000 spoolsv.exe OK: executable.1512.exe
0x81da71a8 0x01000000 explorer.exe OK: executable.1672.exe
0x81f1c7e8 0x00400000 VMwareTray.exe OK: executable.1984.exe
0x81dc1a78 0x00400000 VMwareUser.exe OK: executable.2004.exe
0x81f1a650 0x00400000 ctfmon.exe OK: executable.2020.exe
0x81dc2570 0x00400000 VMwareService.e OK: executable.1032.exe
0x81d33628 0x01000000 alg.exe OK: executable.464.exe
0x81f96220 0x01000000 wscntfy.exe OK: executable.1260.exe
0x8231eda0 0x01000000 msiexec.exe OK: executable.1464.exe
0x81e4d648 0x4ad00000 cmd.exe OK: executable.840.exe
0x81dbdda0 0x00400000 iexplore.exe OK: executable.796.exe
0x82161558 0x00400000 MIRAgent.exe OK: executable.456.exe
PID 796 は 0x00400000 が ImageBase という事になっています、ってこれではマッピングできないですね。。。