wireshark数据包导出及问题
在做ctf misc中关于数据包题目的时候,总会遇到需要将http响应报文中的内容,一般需要将报文导出来,然后再进行编辑,流程如下图所示:
问题
但是最开始我是用的另一种方法,而且经常会出错,记录一下出错原因。在分析一个上传或下载的压缩包时,由于往往数据内容不止一个数据包,为了查看完整报文,一般我们会通过“follow stream”来查看一个会话的全部数据,在确定这个报文是我们需要处理的报文后,接下来需要将报文导出,我最开始尝试的方法如下所示:
大概就是通过查看原始数据,然后保存在notepad++中,删除换行,然后复制粘贴到winhex中,删除前后的无用数据,但是这种方式保存的压缩包通常无法解压。通过对比第一种方式导出的压缩包,发现第二种方式保存的数据包会大一点,通过对比不同,终于发现原因。经测试发现,在原始数据包中某些位置,存在导出数据包中所没有的部分字节,如下图所示:
其实再仔细观察原始数据报文,原始数据报文中,开头和结尾均存在一些奇怪的字符:
数据报文开头
数据报文结尾
解密
导出数据包中不存在这些字符,说明这些字符不属于http response body的负载数据,也就是说不属于压缩包的数据,那只能是http协议中的字段,在网上找了很多关于http协议的材料,终于知道这些字符是什么了。
众所周知,http response 通过在报文头中设置Content-Length
字段来标识响应内容的长度,如果内容是动态生成的,在发送前无法知道具体长度,则可采用分块编码方案,采用分块编码方案时需要设置Transfer-Encoding: chunked
,不用设置Content-Length
字段,response body 格式如下所示:
HTTP/1.1 200 OK<CR><LF>
Transfer-Encoding: chunked<CR><LF>
Content-Type: text/html<CR><LF>
<CR><LF>
3<CR><LF>
abc<CR><LF>
4<CR><LF>
abcd<CR><LF>
...
0<CR><LF>
每个块开头为块长度,与正文之间用<CR><LF>
隔开,正文结束与下一个块也用<CR><LF>
隔开,长度为0的块表示结尾。
这些标志会出现在数据报文中,使用数据报文导出的方式,wireshark会自动去除http协议的标志,而直接复制原始数据,不手动删除这些标志的话,这样生成的压缩包自然就会出错了。
https://www.jianshu.com/p/6e9e4156ece3
https://www.cnblogs.com/humain/p/5464404.html
http://www.zixuephp.net/article-272.html