附件截图
通过筛选, 提取tcp流量, 得到:
抛开弯弯曲曲的思考过程, 直接来看wp:(by:战队: Arr3stY0u)
好, 直接解码得到结果的。好像这题就做完了?思考以下几个问题:
1. 为什么别人能马上知道是ADS-B? 下次比赛过程期间我能不能也查到一些未知的协议?
2.为什么一个协议马上就能有对应的解码器, 下次我要在哪里找小众协议的解码器?
3.ADS-B协议格式是什么? 以后会不会还有可能遇到?
一番查找之后发现了类似ModeS, C, A等同类协议, 增长了知识广度, 也知道了.ADS-B的格式, 以及包含了哪些信息, 如关键的ICAO address, 空速等。
3.仔细研究一下ModeS/ADS-B协议之后发现, 大部分都是56/112长度的, 但我们的流量有一些是64/120长度的, 这些它能解码吗?
为了解答问题3, 安装pyModeS, 尝试解码上述异常流量, 发现在没有直接给出ICAO address的前提下, 居然能直接解码出来。尝试改一两个比特之后, 所得ICAO address与原来的完全不同。由此提出新问题:
4. 为什么有些ModeS消息能直接求出ICAO address, 它是怎么求出来的?
查了半天文档没发现有用信息(后面发现是自己扫得太快, 漏过了重要的部分), 然后想到可以下载pyModeS的源代码, 直接查它是怎么解码的。通过全文搜索ICAO address发现:/decoder/uplink.py
1 def uplink_icao(msg: str) -> str: 2 "Calculate the ICAO address from a Mode-S interrogation (uplink message)" 3 p_gen = 0xFFFA0480 << ((len(msg) - 14) * 4) 4 data = int(msg[:-6], 16) 5 PA = int(msg[-6:], 16) 6 ad = 0 7 topbit = 0b1 << (len(msg) * 4 - 25) 8 for j in range(0, len(msg) * 4, 1): 9 if data & topbit: 10 data ^= p_gen 11 data = (data << 1) + ((PA >> 23) & 1) 12 PA = PA << 1 13 if j > (len(msg) * 4 - 26): 14 ad = ad + ((data >> (len(msg) * 4 - 25)) & 1) 15 ad = ad << 1 16 return "%06X" % (ad >> 2)
查询GPT反馈如下
"在这段代码中,首先从 Mode-S 信息中提取出用于计算地址的部分(即 data
和 PA
),然后使用一个特定的生成多项式 p_gen
进行一系列的位操作。这个算法并不是在反向解析 CRC 来还原原始内容。它是使用CRC算法来计算一种检验值(即 ICAO 地址),这个检验值用于标识特定的航空器。代码中的位操作、移位和异或运算是用于计算这个特定的值,而不是用于恢复原始内容。"
尽管可靠性存疑, 但可以知道大方向是:除了直接明文传输信息, 还可能通过编码方式进行传输, 其中很有可能用到CRC。
5. (尚未解决)在每条信息的前面都有类似1a33(32)ffffffffffff**的结构, 这些是什么协议对ModeS进行封装之后导致的?
....
由此, 一个问题下来, 可以获得充分的知识深度与广度。此为在无疑处有疑。
标签:ModeS,ADS,为例,解码,address,ICAO,谍影,2023,ad From: https://www.cnblogs.com/lynnzixing/p/17912999.html