Scapy 层:层的剖析/解码出错

问题描述 投票:0回答:1

我正在尝试实现一个协议(S7Comm)。该协议包含多个层(它是 ISO on TCP 协议,其中 ISO on TCP 的有效负载是 S7Comm 电报)。我使用的代码基于 s7scan (https://github.com/klsecservices/s7scan),并且基于 Python 2。我已经将代码迁移到 Python 3。(使用 Python 3.11 和 Scapy 2.5.0)

当连接到服务器时,一切正常,但是当收到返回的消息时,Scapy 对消息的解码是错误的。我尝试更改bind_layers()以匹配消息,但这变得越来越糟。 我收到的数据字符串是正确的(所有字节都存在并且位于正确的位置,甚至具有正确的值)。

Scapy 对消息进行解码如下:

cotp._sendrcv(): received answer  b'\x03\x00\x00\x1b\x02\xf0\x802\x03\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\xf0\x00\x00\x01\x00\x01\x01\xe0'
s7.connect(): Received answer in s7.py is  TPKT / COTP / COTP_TCP_Data / S7COMM / Raw

虽然应该如此

cotp._sendrcv(): received answer  b'\x03\x00\x00\x1b\x02\xf0\x802\x03\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\xf0\x00\x00\x01\x00\x01\x01\xe0'
s7.connect(): Received answer in s7.py is  TPKT / COTP_TCP_Data / S7COMM

对于协议的每个部分(TPKT、COTP 和 S7Comm),都有单独的 .py 文件。在 COTP.py 文件中,为每种消息类型定义了一个单独的类并在 bind_layers 中使用:

bind_layers(CLNP, COTP)
bind_layers(TPKT, COTP)
bind_layers(COTP, COTP_TCP_ConnectRequest, pdu_type=0xe0, length=17)
bind_layers(COTP, COTP_TCP_ConnectConfirm, pdu_type=0xd0)
bind_layers(COTP, COTP_LLC_ConnectRequest, pdu_type=0xe1, length=0x1F)
bind_layers(COTP, COTP_LLC_ConnectConfirm, pdu_type=0xd1)
bind_layers(COTP, COTP_DataAcknowledgement, pdu_type=0x60, length=0x09)
bind_layers(COTP, COTP_LLC_Data, pdu_type=0xf0, length=0x07)
bind_layers(COTP, COTP_TCP_Data, pdu_type=0xf0, length=0x02)
bind_layers(COTP, COTP_DisconnectRequest, pdu_type=0x80, length=0x06)
bind_layers(COTP, COTP_DisconnectConfirm, pdu_type=0xC0)

发送(和接收)使用此代码:

           self._send(packet)
            answer = self._socket_.recv(4096)
            print("cotp._sendrcv(): received answer ", answer)
            if answer == None:
                return None
            else:
                return [TPKT(answer)]

Scapy 将返回值解码为 TPKT / COTP / COTP_TCP_Data / S7COMM / Raw。

我已经尝试添加新的“bind_layers”:

bind_layers(TPKT, COTP_TCP_Data, pdu_type=0xf0, length=0x02)

以及其他强制“转换”到正确解码的东西。

我在这里做错了什么?

python scapy
1个回答
0
投票

我发现问题了。我将代码从 Python 2 转换为 Python 3,这是一个转换错误。在旧代码中,数据是字符串还是字节数组并不重要。在 Python 3 中它确实很重要。从 V2 转换到 V3 的尝试 3 成功了,这里我确实关注数据(字符串/字节)的正确转换。

© www.soinside.com 2019 - 2024. All rights reserved.