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}