ctf-misc-memory


本文题目链接: https://pan.baidu.com/s/1sSaO2-9nzPUdNBkk9AAzXQ 提取码: p2se

磁盘内存分析

常用工具&命令

磁盘格式

常见的磁盘分区格式有以下几种

  • Windows: FAT12 -> FAT16 -> FAT32 -> NTFS
  • Linux: EXT2 -> EXT3 -> EXT4
  • FAT 主磁盘结构
    forensic-filesys
  • 删除文件:目录表中文件名第一字节 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
20211025151437

这里获取了前半段flag之后我们就需要找后半段了,接着用7z提取出来0.FAT
20211025152108

下面是另外一个知识了

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

挂载之后我们获取了两个文件
20211025153205

图片叫我们忽略它,于是打开password.txt里面内容为Password 2: RCTF2019

这里涉及到第三个知识:

使用不同的密码挂载出来的内容是不一样的

这里我们挂载成功以后发现打不开
20211025153534

这里选择Winhex打开磁盘
20211025154425
获取后半段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

确定了镜像类型以后,我们常用的几个插件有 cmdlinefilesacnpsscanmemdumpdumpfiles等几个插件。

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

20211022153702

最终我们在地址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

20211022160626

这里我们重复三次就可以了,也可以通过这个发现了key是0x17,写个小脚本也可以

20211022161035

# -*- 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.exenotepad.exe两个进程,对应着两种不同的思路。

思路一

notepad.exedump出来

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

20211025162259

这里获取了提示,内存里面有一个图片

这里不知道为什么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

20211025170826

这里发现似乎是一个269x269的二维码坐标,这里根据坐标画图提供两种方法

  • 方法一:gnuplot
    20211025173353
    得到一个二维码以后,获取了提示信息Here is the vigenere key: aeolus, but i deleted the encrypted message。
    20211025173706

  • 方法二: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")
      
      • 脚本二:
        ```python
        #脚本文件
        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中断后产生的文件
      20211025171127

最终vigenere解密获得key

思路一分支

在获取提示以后,其实还有另外一种思路,就是从磁盘中恢复删除的文件,这里了解到了一个新的软件testdisk

在命令行输入testdisk message.img进入操作界面
20211026141151

进入之后选择List,就会发现一个标红的.message.swp也就是提示中说到的删除的文件
20211026141323

之后先按小写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这个文件
20211026144143

使用foremost提取出来之后,这里采用了DiskGenius分析。可以达到与之前提到的在linux里面挂载一样的效果。
20211026145528

待更新-2021祥云杯-层层取证;2020网鼎杯密码柜

参考链接


文章作者: Secgxx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Secgxx !
  目录