Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Scapy缩短TCP有效负载会导致[TCP上一段未捕获]_Python_Tcp_Wireshark_Scapy - Fatal编程技术网

Python 使用Scapy缩短TCP有效负载会导致[TCP上一段未捕获]

Python 使用Scapy缩短TCP有效负载会导致[TCP上一段未捕获],python,tcp,wireshark,scapy,Python,Tcp,Wireshark,Scapy,我试图通过剥离一些字节来修改TCP负载 只要将这些字节替换为相同长度的其他字节,而不是将它们剥离,修改包就可以了 如果去掉字节,Wireshark会在转储中显示[TCP上一段未捕获]消息 我删除了修改包的校验和和包长度,以便Scapy在发送包时重新计算它们: 删除旧的校验和 del packet_mod[IP].chksum del packet_mod[TCP].chksum 删除旧的数据包长度 del packet_mod[IP]。len 如果我也在修改的数据包的末尾切断了字节,那么修改就可

我试图通过剥离一些字节来修改TCP负载

只要将这些字节替换为相同长度的其他字节,而不是将它们剥离,修改包就可以了

如果去掉字节,Wireshark会在转储中显示[TCP上一段未捕获]消息

我删除了修改包的校验和和包长度,以便Scapy在发送包时重新计算它们:

删除旧的校验和 del packet_mod[IP].chksum del packet_mod[TCP].chksum 删除旧的数据包长度 del packet_mod[IP]。len 如果我也在修改的数据包的末尾切断了字节,那么修改就可以工作了,因为重新发送的TCP段由接收方添加到修改的数据包中

例如:我去掉了20个字节的TCP负载。只有当我在有效负载的末尾额外切断20个字节时,修改才会起作用


我遗漏了什么?

我不明白这部分的意思:

例如:我去掉了20个字节的TCP负载。那么修改呢 仅当我在文件末尾额外剪切20个字节时才有效 有效载荷

无论如何,您缺少的是每个TCP段都承载 TCP标头字段-序列号字段-表示 此段的数据内容在指定的字节流中的位置 正在通过TCP传输

TCP接收器使用段序列号和段长度 段长度根据IP数据报的长度计算 它提供了从中构建连续字节流的段 接收到的流量。例如,如果接收器之前 收集到序列位置200和下一个传入位置之前的所有数据 分段如下所示:

  (segment 1) sequence=200 length=80 data='data data data ...'
  (segment 2) sequence=280 length=60 data='more data ...'
  (segment 3) sequence=340 length=70 data='even more data ...'
然后接收器知道它现在已经收集了所有的数据 达到但不包括位置410。既然没有差距,, 此数据已准备好传递给应用程序

请注意,段号1、2、3不在中 TCP头。这些数字仅在那里,因此此描述 你可以参考一下

显然,如果第2段丢失,而接收器只有 收集段1和段3,然后接收器会知道 收到的数据中有一个缺口。它会确切地知道 差距在哪里:从位置280开始,它缺少60个字节。 TCP承诺提供完整的有序数据流,因此直到 如果填补了这一空白,则不允许接收者发送任何信息 后面的字节,比如它在段中得到的位置340处的70字节 3.申请表的附件。如果丢失的字节不能很快到达 然后,接收者会告诉发送者关于间隙和发送者的信息 将重新传输丢失的数据

这就是为什么从TCP段中删除字节会导致问题的原因。如果 您的程序从第2段删除了20个字节,然后从接收器删除 我们将看到:

  (segment 1) sequence=200 length=80 data='data data data ...'
  (segment 2) sequence=280 length=40 data='more data ...'
  (segment 3) sequence=340 length=70 data='even more data ...'
接收者会得出结论,认为自己发现了 位置320处有20个字节

如果Wireshark正在观察这种流量,那么它将得出相同的结论。 TCP接收器和Wireshark都不知道 缺少的字节是已编辑的段2。线鲨的最爱 合理的猜测是丢失的字节位于 不知何故,没有提供给检查,这就是为什么它 显示上一段未捕获的消息。上面说的是以前的 因为它在检查之前不会发现有缺口 第3段,然后是间隙后的一段

接收器将以处理任何事件的相同方式处理此事件 缺口它将告诉发送者有关间隙的信息,并等待丢失的信息 要重新传输的数据。如果接收器得到丢失的数据 然后它将填补空白,然后像往常一样继续。如果你 继续拦截重传并删除丢失的字节 然后,接收器将继续报告其存在间隙,并且 发送方最终会厌倦重新传输丢失的数据 它将放弃TCP连接

这意味着您不能简单地从正在运行的TCP段中删除数据 希望TCP不会注意到数据丢失。原则上你 可以通过删除一些数据,然后操纵序列来实现 在发送方的所有后续段和所有 由接收者发送的确认,但这是一个更大的任务

参考文献:描述了基本的TCP序列号机制 长期以来 使用序列号提高安全性的最佳实践是 在和中描述
在中正式成为标准。

我不理解这部分的含义:

例如:我去掉了20个字节的TCP负载。那么修改呢 仅当我在文件末尾额外剪切20个字节时才有效 有效载荷

无论如何,您缺少的是每个TCP段都承载 TCP头字段 -序列号字段-表示 此段的数据内容在指定的字节流中的位置 正在通过TCP传输

TCP接收器使用段序列号和段长度 段长度根据IP数据报的长度计算 它提供了从中构建连续字节流的段 接收到的流量。例如,如果接收器之前 收集到序列位置200和下一个传入位置之前的所有数据 分段如下所示:

  (segment 1) sequence=200 length=80 data='data data data ...'
  (segment 2) sequence=280 length=60 data='more data ...'
  (segment 3) sequence=340 length=70 data='even more data ...'
然后接收器知道它现在已经收集了所有的数据 达到但不包括位置410。既然没有差距,, 此数据已准备好传递给应用程序

请注意,段号1、2、3不在中 TCP头。这些数字仅在那里,因此此描述 你可以参考一下

显然,如果第2段丢失,而接收器只有 收集段1和段3,然后接收器会知道 收到的数据中有一个缺口。它会确切地知道 差距在哪里:从位置280开始,它缺少60个字节。 TCP承诺提供完整的有序数据流,因此直到 如果填补了这一空白,则不允许接收者发送任何信息 后面的字节,比如它在段中得到的位置340处的70字节 3.申请表的附件。如果丢失的字节不能很快到达 然后,接收者会告诉发送者关于间隙和发送者的信息 将重新传输丢失的数据

这就是为什么从TCP段中删除字节会导致问题的原因。如果 您的程序从第2段删除了20个字节,然后从接收器删除 我们将看到:

  (segment 1) sequence=200 length=80 data='data data data ...'
  (segment 2) sequence=280 length=40 data='more data ...'
  (segment 3) sequence=340 length=70 data='even more data ...'
接收者会得出结论,认为自己发现了 位置320处有20个字节

如果Wireshark正在观察这种流量,那么它将得出相同的结论。 TCP接收器和Wireshark都不知道 缺少的字节是已编辑的段2。线鲨的最爱 合理的猜测是丢失的字节位于 不知何故,没有提供给检查,这就是为什么它 显示上一段未捕获的消息。上面说的是以前的 因为它在检查之前不会发现有缺口 第3段,然后是间隙后的一段

接收器将以处理任何事件的相同方式处理此事件 缺口它将告诉发送者有关间隙的信息,并等待丢失的信息 要重新传输的数据。如果接收器得到丢失的数据 然后它将填补空白,然后像往常一样继续。如果你 继续拦截重传并删除丢失的字节 然后,接收器将继续报告其存在间隙,并且 发送方最终会厌倦重新传输丢失的数据 它将放弃TCP连接

这意味着您不能简单地从正在运行的TCP段中删除数据 希望TCP不会注意到数据丢失。原则上你 可以通过删除一些数据,然后操纵序列来实现 在发送方的所有后续段和所有 由接收者发送的确认,但这是一个更大的任务

参考文献:描述了基本的TCP序列号机制 长期以来 使用序列号提高安全性的最佳实践是 在和中描述
正式成为中的标准。

感谢您的详细回复!这对我帮助很大!我想在我的情况下,用伪字节替换字符串将是一个更好的解决方案……谢谢您的详细回复!这对我帮助很大!我想在我的情况下,用伪字节替换字符串将是一个更好的解决方案。。。