CTFwriteup

HITCON2018 两道蓝牙流量分析相关题目

1.ev3basic

oxo1题目分析

题目链接可以在这里找到,下载压缩包解压后得到如下两个文件:ev3_basic.jpg和ev3_basic.pklg。

ev3_basic.jpg:

这是一个乐高的机器人,可供编程。从图中我们可以看到hitcon{1d  ea}字样,这应该就是flag,但是缺少了一部分。

ev3_basic.pklg:

是一个截获蓝牙数据包,关于蓝牙协议你需要在这个网站进行一些了解,你至少要知道这四个协议:HCI、L2CAP、SDP、RFCOMM。对比于英特网五层结构来说:HCI相当于与物理层打交道的协议,L2CAP协议则是链路层相关协议,SDP和RFCOMM则是运输层相关协议,当然其上也有对应的应用层相关的一些协议。SDP用来发现周围蓝牙服务,然后由L2CAP来建立信道链接,然后传输由上层RFCOMM给予的数据分组。

很明显,我们需要从这个数据包中提取出flag,这道题我们就只需要关心:RFCOMM协议,在用了bluetooth.dst==xxx && btrfcomm 进行过滤后,我们得到了一些不超过34字节的数据包,从长度为32开始的数据包,我们可以看到一个有意思的东西:

        No.289:

NO.299:

对比两个像个数据包,发现偏移量为0010|06和0010|0a的数据不同,06对应数据是0a和14,0a对应的数据是68和69,继续分析后续几个包,发现变化的地方一共有三个:0010|06、0010|08和0010|0a。再根据搜索,乐高机器人通过坐标可以进行写字,所以我们可以得出如下结论:0010|06和0010|08分别对应x和y坐标(由ev3_basic.jpg可知),那么下面我们所需要做的便是,将坐标和对应的字母取出来,然后通过排序便可得到正确的答案了。

0x02 payload构造

flag_xy = [
    "0a:28:68", "14:28:69", "1e:28:74", "1e:44:5f", "14:52:6f", "0a:36:5f",
    "1e:52:70", "14:36:63", "0a:44:6e", "14:44:64", "1e:36:6f", "0a:52:6c",
    "64:52:7d", "46:28:7b", "5a:28:31", "3c:28:6e", "28:28:63", "6e:28:64",
    "32:28:6f", "50:28:6d", "78:36:69", "28:52:65", "46:52:6b", "3c:44:72",
    "28:44:66", "5a:44:61", "3c:36:75", "64:36:61", "32:44:69", "78:28:35",
    "64:28:6e", "5a:52:74", "78:44:5f", "64:44:72", "46:36:6e", "50:52:69",
    "32:36:6d", "28:36:6d", "5a:36:63", "46:44:6d", "6e:36:74", "50:36:69",
    "3c:52:5f", "50:44:77", "32:52:72", "6e:44:65", "8c:44:65", "a0:36:61",
    "96:44:76", "82:44:64", "a0:44:65", "96:28:72", "82:36:6f", "a0:28:6d",
    "8c:28:30", "96:36:5f", "82:28:74", "8c:36:6e"
]

flag = {}


def parse_xy(f):
    for f in flag_xy:
        f = f.split(":")
        x = int(f[0], 16)
        y = int(f[1], 16)
        c = int(f[2], 16)
        flag[y * 20 + x] = chr(c)#以y轴为每一行的基准,由x来得出字母的先后,为了y的值不干扰字母先后,我们将y进行扩大
    return flag


flag_location = parse_xy(flag_xy)
location = sorted(flag)
flag = ""
for i in location:
    flag += flag_location[i]
print(flag)

2.ev3Scanner

0x01题目描述

这里你可以找到题目,解压后发现三个文件:

ev3_driving_base.jpg:

flag.jpg:

ev3_scanner_recorder.pklg:

第一、第二个文件是flag相关文件,给人感觉是相反方向,但参照小车来则是同一方向。先不管,看一下pklg数据包,任然是一个蓝牙协议相关数据包,但这个包比上个包大得多,足足有30006个数据分组。老规矩我们照样看RFCOMM协议内容:用btrfcomm过滤一下:

可以看到同时混有Sent数据包和Rcvd数据包,我们可以选择只观察Rcvd的,同时也可以发现Rcvd数据包的有效长度只有9Bytes,所以我们用:

btrfcomm.len==9 && btrfcomm && bluetooth.dst==00:00:00:00:00:00

可以看到,大部分的Data结尾都是c040和803f,然后每隔一定数量的包会出现45结尾的数据包,根据这篇文章考虑到乐高机器人写字是用编程编排好特定代码与传感器(sensor)进行交互,在特定的位置下笔,那么就只能一行行的来写,所以会有从左到右或从右到左的方向前进,那么45结尾数据包的应该就是方向调整命令所下达的数据,而出现最多的c040则是纸张背景,那么803f也就是发出下笔指令的数据包了。ok,了解大概结构后,我们需要将数据包导出:在wireshark中通过file->Export Packet Dissections as CSV到处数据包,在导出的数据包中,以45结尾的数据分组为分割标志,可以将csv文件分割为12份,并将之保存为12份文件:

0x02Payload构造

flag = []
for i in range(1, 13):
    line = ""
    with open("line{}.txt".format(i), "r") as f:
        data = f.readlines()
        for d in data:
            data_num = d.strip()
            data_num = data_num[-4:]
            if data_num == "c040" or data_num == "4040":
                line += " "
            else:
                line += "@"

    if i % 2 == 0:
        line = line[::-1]
    flag.append(line)
for line in flag:
    print(line)

最后的结果:

可以勉强看出:{EV3GYROSUCKS}

留言

您的电子邮箱地址不会被公开。 必填项已用 * 标注