下载下来的myheart文件用binwalk分析一下(linux上直接用file看),发现是压缩包文件,解压又得到一个myheart,记事本打开看看文件头,因为最近在做pcapng文件格式的分析,所以很明显看出是一个pcap文件,改文件扩展名,用wireshark打开。
然后随便选个tcp数据包右键追踪TCP流,翻了几个流之后看到如下图:
看到了比较明显的HDR和Photoshop字样,说明在传输png文件,猜测我们需要还原图片文件。这里要注意的是tcp流的顺序并不对应图片的顺序,顺序的区分要根据‘Content-Range:’字段。一共有23个流文件,wireshark自带的导出HTTP对象并不包含http请求头和响应头的信息,所以没法批量导出了。而且做题的时候,懒得开虚拟机,windows上没有趁手的工具,我就手动把这23个流到出成了txt文件,选择上图显示和保存数据为:原始数据,然后save as就导出了。
然后对23个txt进行排序并写文件。首先我们发现最早的字节是从13开始的,也就是png文件头缺损,要把文件头补上。其次,这23个流不是严格的排序,有些传过的部分可能在别的数据包中也存在,区分一下就行了,脚本如下:
import re
png_head = '\x89PNG\x0D\x0A\x1A\x0A\x00\x00\x00\x0DI'
# 获取数据包字节顺序信息
def get_index(flag=False):
with open(filename, "rb") as f:
data = f.read()
rep = re.search(r'Content-Range: bytes (\d*)-(\d*)/(\d*)', data)
if flag:
return data, rep
else:
return rep
# 获取每个流的起始字节数
num = {}
for i in range(23):
filename = str(i) + '.txt'
idx = get_index()
num[int(idx.group(1))] = i
newd = sorted(num.keys())
# 按流起始字节数逐个将流写入png文件
with open("new.png", "wb") as f:
# 写入文件头
f.write(png_head)
# flag标志当前文件末字节数
flag = 12
while newd:
filename = str(num[newd[0]]) + '.txt'
data, rep = get_index(True)
idx = rep.regs[-1][1] + 4
tmp = int(rep.group(2))
# 当前数据包已经被写入文件,不进行写操作
if tmp < flag:
newd.remove(newd[0])
continue
# 当前数据包被部分写入文件,从上个数据包末尾开始写操作
elif newd[0] < flag:
idx += flag - newd[0] + 1
f.write(data[idx:])
flag = tmp
newd.remove(newd[0])
得到了图片如下,flag就在图片里: