题目附件

https://drive.google.com/file/d/1MjMGRiPzweCOdikO3DTaVfbdBK5kyynT/view

挑战描述

我的朋友 John 是一位“环保”主义者兼人道主义者。他极度厌恶《复仇者联盟:无限战争》中灭霸的意识形态。他的编程能力很糟糕,每次写程序都会使用过多的变量。某天,John 给了我一份内存转储文件,并让我找出他在生成转储时正在做什么。你能帮我解决这个问题吗?

初步思路解析

在初级 CTF 比赛中,内存取证类挑战通常会通过描述提供线索。识别这些线索起初可能较难,但随着经验积累会逐渐熟练。根据当前描述,可提取以下关键信息:

  1. “环保”主义者(引号强调)

    • 可能暗示与环境变量(Environment Variables)相关的操作,或双关语(如隐藏字符串 "environmental" 的特殊含义)。

    • 行动建议:使用 Volatility 检查进程环境变量(envars插件)或搜索内存中的敏感字符串(如grep -i "environment")。

  2. John 厌恶灭霸

    • 灭霸的动机是“消灭半数生命”,可能关联数据删除内存清理加密行为(如snap命令或类似操作)。

    • 行动建议:检查进程树中异常终止的进程,或分析可疑文件(如filescan+dumpfiles导出可疑可执行文件)。

  3. 编程能力差且变量过多

    • 可能反映在内存中存在冗余变量名未释放内存脚本文件残留(如 Python 临时对象或泄露的源码)。

    • 行动建议

      • 搜索内存中高频变量名(如volshell结合正则表达式)。

      • 提取潜在脚本文件(如.py.sh)进行逆向分析。


解题

# // 第一步永远都是先提取镜像信息确定操作系统版本 //
# 分析内存镜像的基本信息,包括操作系统类型、版本、架构、建议的profile等
# 执行imageinfo插件,识别该镜像可能的操作系统环境。
vol.py -f Challenge.raw imageinfo

# // 查看系统进程列表 //
# 列出系统中活动(或曾经活动)的进程列表
# --profile 指定使用的内存分析profile
# pslist    插件名,列出内存中的进程列表
vol.py -f Challenge.raw --profile=Win7SP1x86_23418 pslist

# // 看到cmd.exe正在运行,那么查看终端中是否执行了命令 //
# 扫描内存中可能残留的命令行输入历史(针对cmd.exe)
vol.py -f Challenge.raw --profile=Win7SP1x86_23418 cmdscan

# // 这里使用了consoles插件,查看更多信息 //
# 比cmdscan更高级,提取与控制台(Console)对象相关的更多信息,包括输出缓冲区
vol.py -f Challenge.raw --profile=Win7SP1x86_23418 consoles

# // 查看所有进程的环境变量,并筛选出与cmd.exe有关的记录 //
vol.py -f Challenge.raw --profile=Win7SP1x86_23418 envars | grep cmd.exe

# // 查看用户名和密码
vol.py -f Challenge.raw --profile=Win7SP1x86_23418 hashdump

这里发现python

image-ibcw.png

将之前拿到的demon.py.txt内容:335d366f5d6031767631707f

写个py程序解码看看:

# 将十六进制字符串转换为字节对象
a = bytes.fromhex("335d366f5d6031767631707f")

# 便利0到255的整数
for i in range(256):
    b = bytearray()  # 使用bytearray来存储异或后的字节
    for j in a:
        # 对每个字节进行异或操作,并将结果添加到bytearray中
        b.append(j ^ i)

    # 尝试将bytearray解码为字符串(可能失败,因为异或后的字节可能不是有效的UTF-8)
    try:
        # 尝试使用UTF-8解码(这可能会失败并抛出异常)
        decoded_str = b.decode("utf-8")
        print(decoded_str)  # 如果解码成功,则打印字符串
    except UnicodeDecodeError:
        # 如果解码失败,则打印原始字节的十六进制表示(或进行其他处理)
        print(b.hex())  # 打印字节的十六进制表示

得到flag的后半段:1_4m_b3tt3r}

# // 使用mimikatz插件查看用户密码 //
vol.py --plugin=/home/kali/volatility/volatility/plugins -f Challenge.raw --profile=Win7SP0x86 mimikatz

得到flag前半段:flag{you_are_good_but

flag合并后:flag{you_are_good_but1_4m_b3tt3r}