ctf水题---传感器
本着入门的想法,在writeup的帮助下,试做人生中第一道CTF赛题, 本文目的是还原脱离wp的写题思路。
题目出自 i春秋CTF大本营: 2017届全国大学生信息安全竞赛
已知 A传感器的ID和它的输出, 以及B的输出。 求另一个传感器B的ID。
大致思路是从输出中寻找输出和ID的联系,而A的ID和输出就是线索。
发现输出是16进制,遇到进制问题首先做的肯定是比对进制转换后的数字。
先用在线工具转换一下A的输出
发现最有规律的是2进制和8进制数据 但是考虑到8进制不常用,并且它的规律集中在52上,没法利用 所以接下来看2进制: 2进制数据除了前5个1,后面的数据都以二进制对01,10的形式在做排列组合 我们需要的是有规律的数, 所以可以舍弃掉输出中的前两位(3E , 5个1包含在其中) 继续观察余下的二进制数 发现很像数字逻辑中的电平跳变,0代表低位,1代表高位 该二进制数据可能是在传输数据。但是没有连续的0和1,因此该数据很有可能经过编码 查找各编码形式后发现只有曼切斯特编码和差分曼切斯特编码符合这个规律
曼切斯特编码:
data用跳变表示,0和1对应01和10 至于谁对应谁有两种标准:
差分曼切斯特编码:
数字信号对应电平跳变,存在初始电平跳变cc=01, 当前的信号为0意味着当前跳变和上一个跳变相同,为1意味着当前跳变和前一个跳变不同。
知识回顾的差不多了,回到题目,开始撸代码 由于涉及到各种进制转换和划分,c++和java过于反人类,啥都要自己写,不如用python,python很多内嵌方法就能进行进制转换和划分了。 思路很简单 直接贴代码:
import re
def bintohex(s1):
s = re.findall('.{4}', s1)
s2 = ''
for i in s:
s2 += str(hex(int(i, 2))).replace('0x','')
return s2
def diffmqst(s1): #差分曼切斯特
pre = '01'
rst = ''
s = re.findall('.{2}',s1)
for i in s:
if i==pre:
rst += '0'
else : rst+='1'
pre = i
return rst
if __name__ == '__main__':
hex1 = 'AAAAA56A69AA55A95995A569AA95565556'
hex2 = '0x8893CA58'
bin1 = bin(int(hex1, 16)).replace('0b', '')
bin2 = re.findall('.{4}', bin(int(hex1, 16)).replace('0b', ''))
dict1 = {'0101': '11', '1010':'00', '1001':'01', '0110': '10'} #曼切斯特编码1 Thomas
dict2 = {'0101': '00', '1010':'11', '1001':'10', '0110': '01'} #曼切斯特编码2 IEEE802.3
m1 = ''.join(dict1[_] for _ in bin2)
m2 = ''.join(dict2[_] for _ in bin2)
print("曼切斯特编码1 id1: ", bintohex(m1))
print("曼切斯特编码2 id2: ", bintohex(m2))
print("差分曼切斯特编码 id3: ", bintohex(diffmqst(bin1)))
输出:
曼切斯特编码1 id1: 003890f1d73907efe
曼切斯特编码2 id2: ffc76f0e28c6f8101
差分曼切斯特编码 id3: 8024d8893ca584181
发现差分曼切斯特中包含传感器A的ID 沿这个思路, 不难找到传感器B的ID
flag=8845abf3