如何扩充知识广深度:以强网杯2023谍影重重2.0为例

发布时间 2023-12-19 10:17:32作者: lynnzixing

附件截图

 通过筛选, 提取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 信息中提取出用于计算地址的部分(即 dataPA),然后使用一个特定的生成多项式 p_gen 进行一系列的位操作。这个算法并不是在反向解析 CRC 来还原原始内容。它是使用CRC算法来计算一种检验值(即 ICAO 地址),这个检验值用于标识特定的航空器。代码中的位操作、移位和异或运算是用于计算这个特定的值,而不是用于恢复原始内容。"

尽管可靠性存疑, 但可以知道大方向是:除了直接明文传输信息, 还可能通过编码方式进行传输, 其中很有可能用到CRC。

5. (尚未解决)在每条信息的前面都有类似1a33(32)ffffffffffff**的结构, 这些是什么协议对ModeS进行封装之后导致的?

....

 

由此, 一个问题下来, 可以获得充分的知识深度与广度。此为在无疑处有疑。