CISCN2021 | 初赛 MISC

tiny traffic

流量分析,导出HTTP对象

flag_wrapper保存为.gz,解压没有什么发现

有两个br文件,安装brotli, 解压,发现secret没有变化,test解压得到protobuf文件,猜测是要用protoc反序列化

安装protoc, 对test.protoc进行编译,得到test_pb2.py,。

用这个对secret进行反序列化,把test_pb2.py和反序列化代码放在一个文件夹,反序列化代码如下:

import test_pb2
file = open("secret", "rb")
a = test_pb2.PBResponse()
a.ParseFromString(file.read())
print(a)

输出结果:

根据提示,第一段转换为16进制,倒数第二段转换为16进制,然后按顺序拼接字符串,最终的脚本:

import test_pb2

file = open("secret", "rb")

a = test_pb2.PBResponse()
a.ParseFromString(file.read())

print(a)

p = ""
p += hex(a.flag_part_convert_to_hex_plz)[2:]
p += a.dataList[0].flag_part
p += a.dataList[1].flag_part
p += hex(a.flag_part_plz_convert_to_hex)[2:]
p += a.flag_last_part

print(p)

包上CISCN{}, 提交正确

running_pixel

分解gif为png, 检查图片,

发现人物手中心一个白点和周围背景的颜色不一样,是(233,233,233),背景是(247,247,247)
把所有png图片上颜色不一样的点的位置提取出来,组合到新的图片上, 脚本:

from PIL import Image
import time
import os
res = Image.new("L", (400,400), 255)
i=0
files = os.listdir('4')
for file in files:
    img = Image.open(f"4/{file}").convert("RGB")
    
    for x in range(img.size[0]):
        for y in range(img.size[1]):
            p = img.getpixel((x,y))
            if p == (233,233,233):
                print(i,x,y)
                res.putpixel((y,x), 0)
                # res.save(f"res-{i}.png")
    i+=1
res.save("res.png")

得到图片:

修改脚本,把每张图片处理完的结果都输出,观察文字的出现顺序,得到flag

CISCN{12504d0f-9de1-4b00-87a5-a5fdd0986a00}

隔空传话

比赛结束才做出来

PDU编码

在线工具: http://www.sendsms.cn/pdu/
手动解码几条看看

python解码

PDU编码的构成:http://www.jmpcrash.com/?p=599
根据PDU的结构,可以用python写一个解码的程序。
观察解码的结果,可以发现这些编码是被打乱的png的16进制数据,按照时间顺序重新排序输出可以得到图片

from smspdu.codecs import GSM

file = open("data.txt", "r")
file2 = open("res.txt", "w")
file3 = open("res1.txt", "w")
res = ''
dic = {}
for line in file.readlines():
    # PDU的结构
    # 1 18位16进制 短信息中心地址长度段
    #  1.1 2位【SMSC - Length–短信中心号码长度】
    #  1.2 2位 短信中心号码类型
    #  1.3 ?位 短信中心号码值,若为奇数位号码,末尾补F。使用奇偶位互换编码 (长度满足:1.2的长度+1.3的长度 = 1.1的值 *2)
    # 2 20位 手机号码段
    #   2.1 2位
    #   2.2 2位 发送方号码长度
    #   2.3 16位 发送方号码,若为奇数长度,补F。使用奇偶位互换编码
    # 3 4位 协议标识(TP-PID)与用户信息编码方式(TP-DCS)
    #   3.1 2位 协议标识 00表示GSM
    #   3.2 2位 用户信息编码方式
    # 4 14位 短信息发送的日期、时间与时区类型
    #   4.1 6位 日期
    #   4.2 6位 时间
    #   4.3 2位 时区类型
    # 5 用户数据
    # 可以用GSM解码
    date0 = line[34:40]
    date1 = date0[1] + date0[0] + date0[3] + date0[2] + date0[5] + date0[4]
    time0 = line[40:46]
    time1 = time0[1] + time0[0] + time0[3] + time0[2] + time0[5] + time0[4]
    # print(time0, time1, date0, date1)
    res += "time:" + time1 + " "
    # res += "date:" + date1 + " "
    res += GSM.decode(line[50:])
    res += "\n"
    dic[time1] = GSM.decode(line[50:])

    # print(GSM.decode(line[50:]))
    # print(res)
L = list(dic.items())
L.sort(key=lambda x:x[0],reverse=False)
res3=''
for i in L:
    # print(i[1])
    res3 += i[1]
file2.write(res)
file3.write(res3)
# print(res3)

图片修改宽度

此时输出的图片用010检查,会发现CRC校验不对。联系之前的解码,可以知道还有一个w465的信息没有用上。尝试修改图片宽度为465,正常显示

robot

打开提供的附件,有一个控制软件control,有一个rspag文件,有一个流量包。经过百度,可以知道control和robot.rspag是工业机器人的模型,用robot studio可以打开,在百度上还可以找到“PC桌面程序鼠标轨迹在Robotstudio中重现”,和题目给出的代码一样,可以按照这个导入rspag并连接控制程序和机器人
用robot studio 打开,同时运行control.exe, 并让control.exe连接到模型,画出一条轨迹

分析,可以知道控制程序传入的数据格式

查看机器人的代码,一直读到EX_PATH函数,可以知道传入的数据大概由tgPos处理

跟踪create_robtarget,没有什么发现,那么接下来到流量包中查找tgPos

过滤:tcp contains "tgPos"

追踪流,查找tgPos,可以发现tgPos后面的Value中有一个很像刚才在控制程序中看到的坐标,检查了一下所有的tgPos,基本可以确定是这个

grep分离:strings -a cap.pcapng |grep "\[.*\]"

写一个脚本把坐标转换成图片,可以看到最后一个数字基本没有变化,猜测是z轴坐标,前面的分别是x,y坐标

import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
import ast

file = open("res2.txt", "r")

for line in file.readlines():
    s = ast.literal_eval(line)
    x = s[0]
    y = s[1]
    plt.plot(x, y, '*', label='data', color='black')

plt.legend()
plt.show()

画出来

对称翻转处理一下

字母md5,包上CISCN,提交正确
CISCN{d4f1fb80bc11ffd722861367747c0f10}

posted @ 2021-05-19 18:03  云千  阅读(1149)  评论(1编辑  收藏  举报