如何扩充知识广深度:以强网杯2023谍影重重2.0为例
附件截图
通过筛选, 提取tcp流量, 得到:
抛开弯弯曲曲的思考过程, 直接来看wp:(by:战队: Arr3stY0u)
好, 直接解码得到结果的。好像这题就做完了?思考以下几个问题:
1. 为什么别人能马上知道是ADS-B? 下次比赛过程期间我能不能也查到一些未知的协议?
其实题干已经给出了一系列关键词, 航空, 监听, ICAO, CODE, 速度等。 因此, 很有可能是找一个航空类的专用通信协议, 这里面会编码出ICAO地址, 航空器的速度等等内容。
1.1 ICAO是什么玩意儿?
一开始会查到它说的好像是机场代码, 但明显和题干不符, 排除;之后查到它可能是表示航空器编号的, 那
1.2 ICAO CODE(address)的字长是多少, 怎么编码? 相关协议有哪些?
由此查出了ASTERIX之类(其实中间gpt一度提示我ads-b了, 但我忽略了), 虽然对这题而言是个错误的方向, 但知识广度是有了。
2.为什么一个协议马上就能有对应的解码器, 下次我要在哪里找小众协议的解码器?
一般解码首选wireshark, 但通过这题发现还可以用到一些python库。
3.ADS-B协议格式是什么? 以后会不会还有可能遇到?
一番查找之后发现了类似ModeS, C, A等同类协议, 也知道了.ADS-B的格式, 以及包含了哪些信息, 如关键的ICAO address, 空速等。每当遇到雷达、航空器之类的都可以首先想起它。
3.ModeS/ADS-B协议中大部分报文长度都是56/112, 但我们的流量有一些是64/120, 这些报文能解码吗?
为此安装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进行封装之后导致的?
欢迎在留言区讨论
总结:
我认为作为一个网安的初学者, 首先应该多做题, 对应为多见世面。
其次, 尽量只碰会有wp的题目, 否则可能坐牢三四个小时毫无收获。
再次, 应尽可能通过前述的思考方法, 从一道题和搜索引擎中榨出足够的经验值。
直到掩书闭卷回忆此题, 依然可以清晰得到明确的获取信息的思路, 或者能无比清晰其中的一些关键要点, 乃至与已有的知识进行联动。
这个时候, 可算是充分解决了这题。