Sky's blog

曼切斯特与差分曼切斯特

字数统计: 1,578阅读时长: 6 min
2017/07/10 Share

前言

今天正好刚刚到家,想着昨天做了一道差分曼切斯特的题,正好以前还做过曼切斯特的题,再加上计网的物理层编码也说到了这两种方式,所以打算今天总结一下

曼切斯特

第九届全国大学生竞赛 ——— 传感器1

题目:
5555555595555A65556AA696AA6666666955这是某压力传感器无线数据包解调后但未解码的报文(hex)已知其ID为0xFED31F,请继续将报文完整解码

先把16进制都转成2进制,
得到:
010101010101010101010101010101011001010101010101010110100110010101010101011010101010011010010110101010100110011001100110011001100110100101010101

又得知:曼切斯特是从低到高跳变表示“1”,从高到低跳变表示“0”,即01->1,10->0
因此将编码进行曼切斯特解码:
得到:
111111111111111101111111110010111111100000100110000010101010101010011111

转16进制得到:
ffff7fcbf8260aaa9f
发现未包含ID,此处可能存在脑洞,后发现,应该每8位都进行一次反转,即得到:
FFFFFED31F645055F9
最后答案即:flag{FFFFFED31F645055F9}

脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
char = "5555555595555A65556AA696AA6666666955"
result = char.replace("5","0101").replace("6","0110").replace("9","1001").replace("A","1010")
num = len(result)
flag = ""
flag_final = ""
for i in range(0,num,2):
if result[i:i+2] == "01" :
flag += "1"
if result[i:i+2] == "10" :
flag += "0"

for j in range(0,len(flag),8):
flag_final += hex(int(flag[j:j+8][::-1],2))[2:]
print flag_final.upper()

第九届全国大学生竞赛 ——— 传感器2

题目:
现有某ID为0xFED31F的压力传感器,
已知测得
压力为45psi时的未解码报文为:5555555595555A65556A5A96AA666666A955
压力为30psi时的未解码报文为:5555555595555A65556A9AA6AA6666665665
请给出ID为0xFEB757的传感器在压力为25psi时的解码后报文

还是先进行曼切斯特解码,得到:
压力为45psi时:
曼切斯特解码:111111111111111101111111110010111111100011000110000010101010101000011111
经反转处理后Hex:FFFFFED31F635055F8

压力为30psi时:
曼切斯特解码:111111111111111101111111110010111111100001000010000010101010101011101011
经反转处理后Hex:FFFFFED31F425055D7

对比后发现:
FFFF FED31F 63 5055 F8(45psi)
FFFF FED31F 42 5055 D7(30psi)
发现唯一差别
一个是63和42(这个应该是压力值)
一个是F8和D7(这个应该是校验位)
转成10进制,可以看出:
63和42相差33
又因为压力相差15psi,猜测是否每5psi增加11,所以猜测25psi应该是在42和D7的基础上减去11
得到37
那么得到FFFF FEB757 37 5055
然后发现校验值为从ID开始每字节相加的和模256的十六进制值即为校验值
即:
例如:FFFF FED31F 63 5055 F8
FE+D3+1F+63+50+55=2F8(F8即校验值)
再例如:FFFF FED31F 42 5055 D7
FE+D3+1F+42+50+55=2D7(D7即校验值)
那么同理:
对于题目中的25psi:
FFFF FEB757 37 5055
FE+B7+57+37+50+55=2E8
校验值应该为E8
即得到flag:flag{FFFFFEB757375055E8}

差分曼切斯特

第十届全国大学生竞赛 ——— 传感器1

题目:
已知ID为0x8893CA58的温度传感器的未解码报文为:3EAAAAA56A69AA55A95995A569AA95565556
此时有另一个相同型号的传感器,其未解码报文为:3EAAAAA56A69AA556A965A5999596AA95656
请解出其ID,提交flag{不含0x的hex值}

拿到这个题目,容易联想到去年的曼切斯特编码,但尝试后发现3E的存在非常奇怪,于是想到了差分曼切斯特
对于曼切斯特,只需要关注是01还是10即可,而差分曼切斯特却要关注前一位,而给出3E的原因,多半是因为正文需要根据前面的3E来判断是1还是0,故此可以解出该题:
过程如下:
首先把题目的hex转为2进制,得到:(正文处,去掉了3E)
1010101010101010101001010110101001101001101010100101010110101001010110011001010110100101011010011010101010010101010101100101010101010110

差分曼彻斯特编码,每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示“0”或“1”,有跳变为“0”,无跳变为“1”。
下面进行差分曼切斯特编码:
根据3E(0011 1110)进行判断:
依旧对正文两两一组,而每一组是0还是1取决于前一组的最后一位,和本组的第一位
例如正文第一组为:10
而前一组(E中的10)的最后一位为0
故可知道0->1进行了跳变,所以为0
正文第二组为10
而前一组(10)的最后一位为0
故可知道0->1进行了跳变,所以为0
……依次类推
最后进行差分曼切斯特解码:
得到:
00000000001001001101100010001001001111001010010110000100000110000001
再将其进行16进制,得到:
24D8893CA584181
可见ID就在其中,可以断定这个答案应该无误,于是把第二个报文带入,得到:
24D8845ABF34119

可以得到ID为:8845ABF3
最后答案即:flag{8845ABF3}
脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
char = "AAAAA56A69AA55A95995A569AA95565556"
result = char.replace("5","0101").replace("6","0110").replace("9","1001").replace("A","1010")
num = len(result)
flag = ""
flag_final = ""
result = "0"+result
for i in range(1,num,2):
if result[i:i+2][0] !=result[i-1]:
flag += "0"
if result[i:i+2][0] ==result[i-1]:
flag += "1"
print hex(int(flag,2)).upper()[2:]

第十届全国大学生竞赛 ——— 传感器2

题目:
已知ID为0x8893CA58的温度传感器未解码报文为:3EAAAAA56A69AA55A95995A569AA95565556
为伪造该类型传感器的报文ID(其他报文内容不变),请给出ID为0xDEADBEEF的传感器1的报文校验位(解码后hex),以及ID为0xBAADA555的传感器2的报文校验位(解码后hex),并组合作为flag提交。
例如,若传感器1的校验位为0x123456,传感器2的校验位为0xABCDEF,则flag为flag{123456ABCDEF}。

ID:0x8893CA58
报文:3EAAAAA56A69AA55A95995A569AA95565556
先解该报文,运用上述解法,可以得到:24D8893CA584181
易得:24D 8893CA58 41 81

ID:0x8845ABF3
报文:3EAAAAA56A69AA556A965A5999596AA95656
易得:24D 8845ABF3 41 19

根据计算机网络报文首部的一些学习,这里我进行了类比,可能校验位应该是最后几位,依次尝试过都无果,但想到,除了最后2位不同,中间ID不同,其他均相同,可见校验位就是最后2位,那么校验位的计算应该是用CRC进行计算,而前面的位数是7位,尝试计算,但是得出的值并不是预计的。
后来想到可能缺位了,故又往前算了一位:
得到:024D 8893CA58 41 81024D 8845ABF3 41 19
024D 8893CA58 41024D 8845ABF3 41进行CRC8运算(网上有计算器)
可以得到81和19,与猜想一致

下面就可以用这个方法解出flag
带入ID:DEADBEEFBAADA555
得到:024D DEADBEEF 41024D BAADA555 41
计算CRC8,分别得到:B5和15
故可以得出flag:flag{B515}

点击赞赏二维码,您的支持将鼓励我继续创作!
CATALOG
  1. 1. 前言
  2. 2. 曼切斯特
    1. 2.1. 第九届全国大学生竞赛 ——— 传感器1
    2. 2.2. 第九届全国大学生竞赛 ——— 传感器2
  3. 3. 差分曼切斯特
    1. 3.1. 第十届全国大学生竞赛 ——— 传感器1
    2. 3.2. 第十届全国大学生竞赛 ——— 传感器2