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}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM