最近忙着写毕业论文,好久不更新Blog,写一下2015 XCTF中0ops 0CTF资格赛的一道简单题目的分析,最近几次比赛做的都不是很好,排名严重下滑了。
我们知道在BT下载的时候,文件块的下载时没有顺序的,所以这是一个bittorrent文件重组的问题。题目给了一个pcapng文件,首先要做的是找到文件所在的网络流量,这个还是比较简单的,在wireshark中打开pcapng文件,发现挨着很多长度为1514和54的包,随便选一条之后Follow TCP Stream即可,之后看到的就是整个会话的网络流量了,如下图所示:
分析一下这个流量,可以看到一个BM字样,那个就是BMP位图的Magic标志了,所以现在过滤出下载流量,并且要删除第一个文件数据块之前的所有数据,上图中的红框就是第一个文件数据块了。将过滤之后的数据进行保存。
现在分析一下数据,第一个数据块中,在BM的前面还有13字节,如下:
Offset 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0000000 00 00 40 09 07 00 00 00 00 00 00 00 00 42 4d 36 |
这个就是bittorrent返回的数据块的头部信息。其结构如下:
Piece: <len=0009+X><id=7><index><begin><block> The piece message is variable length, where X is the length of the block. The payload contains the following information •index: integer specifying the zero-based piece index •begin: integer specifying the zero-based byte offset within the piece •Block: block of data, which is a subset of the piece specified by index. |
所以对数据包的分析如下:
- 00 00 40 09:0×4009,表示在数据00 00 40 09之后紧跟着0×4009大小的数据,其中id、index、begin占用9字节,真正的数据块大小为0×4000字节;
- 07:id号,表示piece,表示这是一个数据块;
- 00 00 00 00:数据块的下标索引,这里为0,表示是文件的第一个数据块;
- offset:数据块在piece里面的偏移值;
从Wireshark dump出来的数据就是许许多多这样的piece,而且,分析可以发现每一个piece都是完整的,也就是不需要考虑offset,因此可以很容易的编写一个Python脚本来重组文件0ops 0CTF。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import struct def restruct(): f = open("temp.bmp", "rb") data = f.read() f.close() chunks = {} o = 0 while o < len(data): size = struct.unpack(">L", data[o:o+4])[0] o += 4 index = struct.unpack(">L", data[o+1:o+5])[0] chunks[index] = data[o+9:o+size] o += size f = open("flag.bmp", "wb") for i in xrange(len(chunks)): f.write(chunks[i]) f.close() if __name__ == "__main__": restruct() # Author: http://www.programlife.net/ |
看网上介绍好像可以通过tshark命令行完成文件提取,不过怎么玩都失败_(:зゝ∠)_
reference:
http://cs.ecs.baylor.edu/~donahoo/classes/5321/projects/bittorrent/BitTorrent%20Protocol%20Specification.doc |
本文地址: 程序人生 >> 0ops 0CTF Quals peers writeup
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!