实验吧 Broken Heart

博客介绍了CTF相关实验中,对下载的myheart文件进行分析。先用binwalk或file确定为压缩包,解压后发现是pcap文件,用wireshark打开。根据数据包追踪TCP流,发现传输png文件,手动导出23个流为txt文件,排序并补全文件头,最终还原图片获取flag。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值