本文题目链接: https://pan.baidu.com/s/1sSaO2-9nzPUdNBkk9AAzXQ 提取码: p2se
磁盘内存分析
常用工具&命令
磁盘格式
常见的磁盘分区格式有以下几种
- Windows: FAT12 -> FAT16 -> FAT32 -> NTFS
- Linux: EXT2 -> EXT3 -> EXT4
- FAT 主磁盘结构
- 删除文件:目录表中文件名第一字节
e5
。
VMDK
VMDK 文件本质上是物理硬盘的虚拟版,也会存在跟物理硬盘的分区和扇区中类似的填充区域,我们可以利用这些填充区域来把我们需要隐藏的数据隐藏到里面去,这样可以避免隐藏的文件增加了 VMDK 文件的大小(如直接附加到文件后端),也可以避免由于 VMDK 文件大小的改变所带来的可能导致的虚拟机错误。而且 VMDK 文件一般比较大,适合用于隐藏大文件。
内存
- 解析 Windows / Linux / Mac OS X 内存结构
- 分析进程,内存数据
- 根据题目提示寻找线索和思路,提取分析指定进程的特定内存数据
下面通过几道题目来看一下相关工具的使用以及内存分析的套路
例题-Rctf-磁盘取证
这道题首先要了解一个冷知识
VMDK:(VMWare Virtual Machine Disk Format)是虚拟机VMware创建的虚拟硬盘格式,文件存在于VMware文件系统中,被称为VMFS(虚拟机文件系统),可以用7z打开
拿到encrypt.vmdk
这个文件首先想到的就是做内存分析或者恢复虚拟机,但是这里使用volatility分析失败。虚拟机创建也失败。
volatility -f encrypt.vmdk imageinfo
Volatility Foundation Volatility Framework 2.6.1
INFO : volatility.debug : Determining profile based on KDBG search...
Suggested Profile(s) : No suggestion (Instantiated with no profile)
AS Layer1 : FileAddressSpace (/Users/.../encrypt.vmdk)
PAE type : No PAE
于是用010editor打开,在中部发现了大量重复字符。rctf{unseCure_quick_form4t_vo1ume
这里获取了前半段flag之后我们就需要找后半段了,接着用7z提取出来0.FAT
下面是另外一个知识了
FAT格式: 即FAT16,这是MS-DOS和最早期的Win 95操作系统中最常见的磁盘分区格式。它采用16位的文件分配表,能支持最大为2GB的分区,几乎所有的操作系统都支持这一种格式,从DOS、Win 95、Win 97到现在的Win 98、Windows NT、Win2000,但是在FAT16分区格式中,它有一个最大的缺点:磁盘利用效率低。因为在DOS和Windows系统中,磁盘文件的分配是以簇为单位的,一个簇只分配给一个文件使用,不管这个文件占用整个簇容量的多少。这样,即使一个文件很小的话,它也要占用了一个簇,剩余的空间便全部闲置在那里,形成了磁盘空间的浪费。由于分区表容量的限制,FAT16支持的分区越大,磁盘上每个簇的容量也越大,造成的浪费也越大。所以为了解决这个问题,微软公司在Win 97中推出了一种全新的磁盘分区格式FAT32
挂载之后我们获取了两个文件
图片叫我们忽略它,于是打开password.txt
里面内容为Password 2: RCTF2019
这里涉及到第三个知识:
使用不同的密码挂载出来的内容是不一样的
这里我们挂载成功以后发现打不开
这里选择Winhex打开磁盘
获取后半段flag_and_corrupted_1nner_v0lume}_and_corrupted_1nner_v0lume}
例题-find_secret
拿到这个题目,首先确定一下内存的类型
volatility -f 2.data imageinfo
Volatility Foundation Volatility Framework 2.6.1
INFO : volatility.debug : Determining profile based on KDBG search...
Suggested Profile(s) : WinXPSP1x64, Win2003SP1x64, WinXPSP2x64, Win2003SP2x64
AS Layer1 : WindowsAMD64PagedMemory (Kernel AS)
AS Layer2 : FileAddressSpace (/Users/secgxx/Desktop/CTF/0x04MISC/内存分析/例题-内存分析1/2.data)
PAE type : No PAE
DTB : 0x153000L
KDBG : 0xf800011b3d40L
Number of Processors : 2
Image Type (Service Pack) : 2
KPCR for CPU 0 : 0xfffff800011b5000L
KPCR for CPU 1 : 0xfffffadff5a6b000L
KUSER_SHARED_DATA : 0xfffff78000000000L
Image date and time : 2019-08-17 07:30:53 UTC+0000
Image local date and time : 2019-08-17 15:30:53 +0800
确定了镜像类型以后,我们常用的几个插件有 cmdline
,filesacn
,psscan
,memdump
,dumpfiles
等几个插件。
volatility -f 2.data --profile=WinXPSP1x64 cmdline
Volatility Foundation Volatility Framework 2.6.1
*********************************************************
pythonw.exe pid: 2364
Command line : "C:\Python34\pythonw.exe" "C:\Python34\Lib\idlelib\idle.pyw" -e "C:\Documents and Settings\Administrator\桌面\create_secret.py"
通过cmdline我们发现了create_secret.py
这么个东西,因此我们接着用filescan
这个时候问题来了
volatility -f 2.data --profile=WinXPSP1x64 filescan|grep 桌面
Volatility Foundation Volatility Framework 2.6.1
0x0000000005a5b3f0 1 1 R--rw- \Device\HarddiskVolume1\Documents and Settings\Administrator\桌面
0x0000000005accb90 3 1 R--rwd \Device\HarddiskVolume1\Documents and Settings\All Users\桌面
0x0000000005accf10 3 1 R--rwd \Device\HarddiskVolume1\Documents and Settings\Administrator\桌面
0x0000000005acec10 1 0 -W-rw- \Device\HarddiskVolume1\Documents and Settings\Administrator\桌面\lalala.secret
0x000000000b03d470 1 1 R--rw- \Device\HarddiskVolume1\Documents and Settings\Administrator\桌面
volatility -f 2.data --profile=WinXPSP1x64 dumpfiles -Q 0x0000000005acec10 -D .
Volatility Foundation Volatility Framework 2.6.1
DataSectionObject 0x05acec10 None \Device\HarddiskVolume1\Documents and Settings\Administrator\桌面\lalala.secret
导出来之后呢其实就获取了加密脚本输出的内容
c1IufV1PRUZOX1VtTyYiIE9BRXJxeyZSWyRVc0MmIiJPQS52cU9FUkN6XXVyQlJ7c1JFQHJBI3xGeWNzcXtnL3QkZyNccCoq
但是我们只在桌面发现了一个由python脚本生成的加密文件,加密脚本怎么获取呢
注意到这个脚本是由pythonw.exe
运行了的,因此考虑使用memdump
volatility -f 2.data --profile=WinXPSP1x64 psscan|grep python
Volatility Foundation Volatility Framework 2.6.1
0x0000000005a79040 pythonw.exe 2412 2364 0x000000000dc1c000 2019-08-17 07:30:40 UTC+0000
0x000000000b03d040 pythonw.exe 2364 1460 0x0000000008048000 2019-08-17 07:30:31 UTC+0000
volatility -f 2.data --profile=WinXPSP1x64 memdump -p 2364 -D .
Volatility Foundation Volatility Framework 2.6.1
************************************************************************
Writing pythonw.exe [ 2364] to 2364.dmp
接下来就是从内存里面把create_secret.py,用010editor打开,因为我们已经知道了最终生成的文件是lalala.secret
,因此我们直接搜索lalala
最终我们在地址990BC5h
获取脚本
#/usr/bin/env python
#-*- coding:utf-8 -*-
import os
from base64 import b64encode
# flag{ this is not flag, it's just a comment in python source file.I hide some secret with python, I don't think you can found it.
secret_file_name = 'flag.txt'
secret_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), secret_file_name)
secret = ''
with open(secret_file_path, 'r') as f:
secret = f.read()
os.remove(secret_file_path)
key = input("Set a value 0x00 < key < 0xff:")
key = int(key[2:],16)
def encrypt(content, key):
result = ''
for c in content:
result += chr(ord(c) ^ key)
return b64encode(result.encode('utf-8'))
for i in range(3):
secret = encrypt(secret, key)
if type(secret) != 'str':
secret = secret.decode('utf-8')
result_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'lalala.secret')
with open(result_path, 'w') as f:
f.write(secret)
os.remove(os.path.abspath(__file__))
这里就清楚了,加密脚本一共进行了三次异或和base64编码的组合操作,最终获取flag
这里我们重复三次就可以了,也可以通过这个发现了key是0x17,写个小脚本也可以
# -*- coding: utf-8 -*-
from base64 import b64decode
cipher='c1IufV1PRUZOX1VtTyYiIE9BRXJxeyZSWyRVc0MmIiJPQS52cU9FUkN6XXVyQlJ7c1JFQHJBI3xGeWNzcXtnL3QkZyNccCoq'
key='0x17'
key = int(key[2:],16)
for i in range(3):
cipher = b64decode(cipher.encode('utf-8'))
print cipher
result = ''
for c in cipher:
result += chr(ord(c) ^ key)
cipher = result
print cipher
例题-easy_dump(2018护网杯)
老规矩,volatility梭哈一波先
volatility -f easy_dump.img imageinfo
Volatility Foundation Volatility Framework 2.6.1
INFO : volatility.debug : Determining profile based on KDBG search...
Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_24000, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_24000, Win7SP1x64_23418
AS Layer1 : WindowsAMD64PagedMemory (Kernel AS)
AS Layer2 : FileAddressSpace (/Users/secgxx/Desktop/CTF/0x04MISC/内存分析/例题-easy_dump/easy_dump.img)
PAE type : No PAE
DTB : 0x187000L
KDBG : 0xf8000403b070L
Number of Processors : 1
Image Type (Service Pack) : 0
KPCR for CPU 0 : 0xfffff8000403cd00L
KUSER_SHARED_DATA : 0xfffff78000000000L
Image date and time : 2018-10-02 13:53:05 UTC+0000
Image local date and time : 2018-10-02 21:53:05 +0800
查看一下系统进程
volatility -f easy_dump.img --profile=Win7SP1x64 psscan
Volatility Foundation Volatility Framework 2.6.1
Offset(P) Name PID PPID PDB Time created Time exited
------------------ ---------------- ------ ------ ------------------ ------------------------------ ------------------------------
0x00000000230b1310 conhost.exe 860 408 0x0000000021401000 2018-10-02 13:53:04 UTC+0000
0x00000000230f5b30 audiodg.exe 2720 768 0x000000001b805000 2018-10-02 13:52:48 UTC+0000
0x000000002326bb30 VGAuthService. 1680 500 0x0000000007845000 2018-10-02 13:21:08 UTC+0000
0x00000000232b5970 SearchIndexer. 2308 500 0x0000000006faf000 2018-10-02 13:21:13 UTC+0000
0x00000000233005c0 vmtoolsd.exe 1704 500 0x0000000015204000 2018-10-02 13:21:08 UTC+0000
0x0000000023344060 dllhost.exe 2760 624 0x0000000010636000 2018-10-02 13:52:59 UTC+0000
0x000000002338f910 WmiPrvSE.exe 1468 624 0x0000000006df2000 2018-10-02 13:21:09 UTC+0000
0x00000000233a5640 dllhost.exe 1588 500 0x000000000ea59000 2018-10-02 13:21:09 UTC+0000
0x00000000233ae060 svchost.exe 1964 500 0x0000000002587000 2018-10-02 13:21:09 UTC+0000
0x00000000233d8060 TPAutoConnSvc. 2008 500 0x0000000001c0d000 2018-10-02 13:21:09 UTC+0000
0x00000000233e74e0 msdtc.exe 864 500 0x000000001c3e2000 2018-10-02 13:21:11 UTC+0000
0x000000002346faa0 svchost.exe 388 500 0x000000001e498000 2018-10-02 13:21:06 UTC+0000
0x000000002348e9e0 svchost.exe 1000 500 0x000000001e5a2000 2018-10-02 13:21:06 UTC+0000
0x00000000235275f0 dwm.exe 1232 880 0x000000002041c000 2018-10-02 13:21:07 UTC+0000
0x000000002353ab30 taskhost.exe 1260 500 0x0000000007324000 2018-10-02 13:21:07 UTC+0000
0x0000000023580950 svchost.exe 1316 500 0x000000001e807000 2018-10-02 13:21:07 UTC+0000
0x00000000235ab170 DumpIt.exe 1056 1244 0x00000000042a0000 2018-10-02 13:53:04 UTC+0000
0x00000000235eb060 vmtoolsd.exe 1416 1244 0x000000001f1fa000 2018-10-02 13:21:07 UTC+0000
0x0000000023607060 csrss.exe 408 388 0x000000000c4b6000 2018-10-02 13:21:05 UTC+0000
0x0000000023633b30 spoolsv.exe 1196 500 0x0000000015355000 2018-10-02 13:21:07 UTC+0000
0x0000000023647060 winlogon.exe 456 388 0x000000000ad3c000 2018-10-02 13:21:05 UTC+0000
0x00000000236815f0 services.exe 500 396 0x0000000008d41000 2018-10-02 13:21:05 UTC+0000
0x00000000236836e0 lsm.exe 516 396 0x000000000a32c000 2018-10-02 13:21:05 UTC+0000
0x000000002368b220 lsass.exe 508 396 0x000000000a164000 2018-10-02 13:21:05 UTC+0000
0x0000000023690b30 svchost.exe 624 500 0x00000000090e2000 2018-10-02 13:21:05 UTC+0000
0x0000000023705b30 explorer.exe 1244 1204 0x00000000092c2000 2018-10-02 13:21:07 UTC+0000
0x00000000237304a0 svchost.exe 716 500 0x00000000086ea000 2018-10-02 13:21:06 UTC+0000
0x0000000023738b30 vmacthlp.exe 684 500 0x000000000769e000 2018-10-02 13:21:06 UTC+0000
0x00000000237614a0 svchost.exe 768 500 0x0000000008675000 2018-10-02 13:21:06 UTC+0000
0x00000000237dc060 svchost.exe 880 500 0x000000001bf44000 2018-10-02 13:21:06 UTC+0000
0x00000000237e4b30 svchost.exe 940 500 0x000000001b693000 2018-10-02 13:21:06 UTC+0000
0x00000000239fb060 wininit.exe 396 336 0x000000000c9fc000 2018-10-02 13:21:05 UTC+0000
0x0000000023bb4060 csrss.exe 344 336 0x000000000ccf6000 2018-10-02 13:21:04 UTC+0000
0x0000000024659b30 smss.exe 260 4 0x00000000104a3000 2018-10-02 13:21:03 UTC+0000
0x0000000024810060 sppsvc.exe 2472 500 0x000000000b296000 2018-10-02 13:23:09 UTC+0000
0x000000002491bb30 svchost.exe 2220 500 0x0000000018271000 2018-10-02 13:23:09 UTC+0000
0x0000000024b47870 TPAutoConnect. 2548 2008 0x0000000018d3d000 2018-10-02 13:21:19 UTC+0000
0x0000000024b48490 conhost.exe 2556 408 0x000000000fa02000 2018-10-02 13:21:19 UTC+0000
0x00000000254b3b30 notepad.exe 2872 1244 0x0000000008151000 2018-10-02 13:26:51 UTC+0000
0x0000000025749b30 System 4 0 0x0000000000187000 2018-10-02 13:21:03 UTC+0000
这里有两个进程DumpIt.exe
和notepad.exe
两个进程,对应着两种不同的思路。
思路一
把 notepad.exe
dump出来
volatility -f easy_dump.img --profile=Win7SP1x64 memdump -p 2872 -D .
Volatility Foundation Volatility Framework 2.6.1
************************************************************************
Writing notepad.exe [ 2872] to 2872.dmp
这里获取了提示,内存里面有一个图片
这里不知道为什么kali和mac里面的strings出来的结果不一样- -
于是利用filescan获取了一张图片,并将其dump出来
volatility -f easy_dump.img --profile=Win7SP1x64 filescan|grep jpg
Volatility Foundation Volatility Framework 2.6.1
0x000000002557b2b0 32 0 RW---- \Device\HarddiskVolume1\phos.jpg
使用binwalk进行分析
binwalk phos.jpg
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 JPEG image data, EXIF standard
12 0xC TIFF image data, little-endian offset of first image directory: 8
2238922 0x2229CA Zip archive data, at least v2.0 to extract, compressed size: 87797, uncompressed size: 1048576, name: message.img
2326869 0x238155 End of Zip archive, footer length: 22
发现图片里有一个message.img
,分离出来
binwalk -e -o 0x2229CA phos.jpg
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
2238922 0x2229CA Zip archive data, at least v2.0 to extract, compressed size: 87797, uncompressed size: 1048576, name: message.img
2326869 0x238155 End of Zip archive, footer length: 22
file message.img
message.img: Linux rev 1.0 ext2 filesystem data, UUID=34d27b8e-1aa5-441f-bfd9-bdc765cc4edd (large files)
发现是一个ext2的文件系统,在linux里面挂载,挂载之后发现了hint.txt
[Desktop] mkdir message
[Desktop] id
uid=0(root) gid=0(root) groups=0(root),144(kaboxer)
[Desktop] mount message.img ./message
[Desktop] cd message
[message] ls -la
total 271
drwxr-xr-x 4 root root 1024 Oct 1 2018 .
drwxr-xr-x 3 root root 4096 Oct 25 17:04 ..
-rw-r--r-- 1 root root 257163 Sep 28 2018 hint.txt
drwx------ 2 root root 12288 Oct 1 2018 lost+found
drwx------ 4 root root 1024 Oct 1 2018 .Trash-0
这里发现似乎是一个269x269的二维码坐标,这里根据坐标画图提供两种方法
方法一:gnuplot
得到一个二维码以后,获取了提示信息Here is the vigenere key: aeolus, but i deleted the encrypted message。
方法二:python脚本
- 脚本一:
#!/usr/bin/env python import Image MAX = 32 pic = Image.new("RGB",(300,300)) f=open('message.txt','r') s=f.readline() a='' #lines=35345 while s: a=s.split(' ') x=int(a[0]) y=int(a[1][:-1]) print x,y pic.putpixel([x,y],(100, 100, 100)) s=f.readline() f.close() pic.show() pic.save("flag.png")
- 脚本二:
根据提示我们去翻找一下垃圾箱,找到了#脚本文件 import matplotlib.pyplot as plt import numpy as np x = [] y = [] with open('hint.txt','r') as f: datas = f.readlines() for data in datas: arr = data.split(' ') x.append(int(arr[0])) y.append(int(arr[1])) plt.plot(x,y,'ks',ms=1) plt.show()
.message.swp
也就是vim中断后产生的文件
- 脚本二:
- 脚本一:
最终vigenere解密获得key
思路一分支
在获取提示以后,其实还有另外一种思路,就是从磁盘中恢复删除的文件,这里了解到了一个新的软件testdisk
在命令行输入testdisk message.img
进入操作界面
进入之后选择List,就会发现一个标红的.message.swp
也就是提示中说到的删除的文件
之后先按小写c再按一下大写C就可以复制出来了(注意版本和平台都可能影响选项)
思路二
思路二也就是通过dumpDumpIt.exe
这个进程来分析
volatility -f easy_dump.img --profile=Win7SP1x64 memdump -p 1056 -D .
Volatility Foundation Volatility Framework 2.6.1
************************************************************************
Writing DumpIt.exe [ 1056] to 1056.dmp
使用binwalk分析的时候会发现有message.img
这个文件
使用foremost提取出来之后,这里采用了DiskGenius分析。可以达到与之前提到的在linux里面挂载一样的效果。