实验吧 Broken Heart

下载下来的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就在图片里:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值