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}