【攻防世界】- 传感器1

⭕、知识点

1、进制转换
2、曼切斯特码与差分曼切斯特码
3、脚本编写

一、题目

二、解题

1、分析题目,首先要知道ID是哪几位应该是需要从第一个传感器的解码报文里去找,解码报文里应该有一段与传感器ID相同的文本,确定出ID的位置后用同样的解码方法解码第二个传感器的报文,提取出对应的ID

2、未解码报文是十六进制编码,先将其转为二进制看看能不能发现什么

raw_data = '3EAAAAA56A69AA55A95995A569AA95565556'
raw_data_bin = bin(int(raw_data,16))[2:]
print(raw_data_bin)

输出:

3、观察发现除了前面几位,后续的数据都是01频繁跳变,而且0和1都没有重复超过3位,猜测是曼切斯特码,而前面几位应该是传感器的前导码,用于同步时钟信号或者表示数据开始传输。

4、删掉前导码3E,但是不确定目前是曼切斯特码编码还是差分曼切斯特码编码,所以写2个函数分别对原始数据进行解码尝试。

import textwrap
raw_data = 'AAAAA56A69AA55A95995A569AA95565556'
raw_data_bin = bin(int(raw_data,16))[2:]
print(raw_data_bin)

# 曼切斯特码解码
def mqst_decode(input):
    if len(input) % 2 != 0:
        print("非法曼切斯特码,长度不是偶数")
        return None
    output = ""
    for i in textwrap.wrap(input, 2):
        if i[0] == "1" and i[1] == "0":
            output += "1"
        elif i[0] == "0" and i[1] == "1":
            output += "0"
        else:
            print("非法曼切斯特码,解码错误")
            return None
    return output

# 差分曼切斯特码解码
def diffmqst_decode(input):
    if len(input) % 2 != 0:
        print("非法差分曼切斯特码,长度不是偶数")
        return None
    output = ""
    # 因为差分曼切斯特码常以连续的01作为前导码,所以将其初始化为"01"
    last_two_bits = "01"
    for two_bits in textwrap.wrap(input,2):
        if two_bits != "01" and two_bits != "10":
            print("非法差分曼切斯特码")
            break
        if two_bits == last_two_bits:
            output += "0"
        else:
            output += "1"
        last_two_bits = two_bits
    return output

print(hex(int(mqst_decode(raw_data_bin),2))[2:])
print(hex(int(diffmqst_decode(raw_data_bin),2))[2:])

5、得到输出结果

发现差分曼切斯特码解码后的数据包含第一个传感器的ID

6、验证了猜想是正确的,现在把另一段未解码的传感器报文(去掉3E)开头后,放入相同的脚本中进行解码,取相同位置的数据并转为大写,便得到了flag

三、答案

flag{8845ABF3}

四、收获与总结

本题最大收获就是驱使我了解了曼切斯特码与差分曼切斯特码解码与编码原理。参考连接

  • 曼切斯特码:高跳低为1,低跳高为0
  • 差分曼切斯特码:与前面的相同为0,不相同为1。(同时注意前导码为01)
posted @ 2025-05-28 16:04  wyuu101  阅读(122)  评论(0)    收藏  举报