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

最后修改:2022 年 01 月 27 日
如果觉得我的文章对你有用,请随意赞赏