内存取证系列:Memlabs-0
题目附件
挑战描述
我的朋友 John 是一位“环保”主义者兼人道主义者。他极度厌恶《复仇者联盟:无限战争》中灭霸的意识形态。他的编程能力很糟糕,每次写程序都会使用过多的变量。某天,John 给了我一份内存转储文件,并让我找出他在生成转储时正在做什么。你能帮我解决这个问题吗?
初步思路解析
在初级 CTF 比赛中,内存取证类挑战通常会通过描述提供线索。识别这些线索起初可能较难,但随着经验积累会逐渐熟练。根据当前描述,可提取以下关键信息:
“环保”主义者(引号强调)
可能暗示与环境变量(Environment Variables)相关的操作,或双关语(如隐藏字符串 "environmental" 的特殊含义)。
行动建议:使用 Volatility 检查进程环境变量(
envars插件)或搜索内存中的敏感字符串(如grep -i "environment")。
John 厌恶灭霸
灭霸的动机是“消灭半数生命”,可能关联数据删除、内存清理或加密行为(如
snap命令或类似操作)。行动建议:检查进程树中异常终止的进程,或分析可疑文件(如
filescan+dumpfiles导出可疑可执行文件)。
编程能力差且变量过多
可能反映在内存中存在冗余变量名、未释放内存或脚本文件残留(如 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

将之前拿到的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}