首页
论坛
课程
招聘
[原创]RoarCTF MISC Davinci_Cipher题解
2019-10-28 10:53 5687

[原创]RoarCTF MISC Davinci_Cipher题解

2019-10-28 10:53
5687

RoarCTF MISC Davinci_Cipher

这道题实在是可惜,第一天磕了半天没出来。第二天灵光乍现,但是晚了一分钟,比赛结束了。。。唉。。后来看官方的wp,思路步骤全是一样的。。。心痛。。但是这道题感觉很好玩,所以特意总结一下。

初步分析

题目给了两个附件,一个txt,一个流量包。打开txt看一下:

U+1F643U+1F4B5U+1F33FU+1F3A4U+1F6AAU+1F30FU+1F40EU+1F94BU+1F6ABU+1F606U+1F383U+1F993U+2709U+1F33FU+1F4C2U+2603U+1F449U+1F6E9U+2705U+1F385U+2328U+1F30FU+1F6E9U+1F6A8U+1F923U+1F4A7U+1F383U+1F34DU+1F601U+2139U+1F4C2U+1F6ABU+1F463U+1F600U+1F463U+1F643U+1F3A4U+2328U+1F601U+1F923U+1F3A4U+1F579U+1F451U+1F6AAU+1F374U+1F579U+1F607U+1F374U+1F40EU+2705U+2709U+1F30FU+23E9U+1F40DU+1F6A8U+2600U+1F607U+1F3F9U+1F441U+1F463U+2709U+1F30AU+1F6A8U+2716

很明显是unicode码,这里首先就想到了可能会用到代码点去进行转换(也就是这个第一印象给自己带偏了)。
txt文件没有其他信息了,直接开流量包吧:

 

 

首先注意到流量中有一个图片,直接导出特定包,然后把图片提取出来(修改二进制数据为图片格式,然后保存称图片格式就可以):

 

 

然后开始各种蹂躏这个图,然并卵,没有任何有价值的信息。思路不对,而且没有发现图片和txt的丝毫关联。

进一步分析

回到流量包,继续磕,发现了另外一个猫腻:存在USB协议流量

  • 分析USB流量
    发现了一个Wacom PTH-660的设备。果断google,是一个数位板。之前遇到过一个类似的ctf题目,大概猜测是通过数位板进行绘画,然后在流量中体现。
  • 分析数位板流量
    USB流量的数据段是Leftover Capture Data,发现的数位板的src为1.9.1,frame长度为54。直接筛选可能的有效流量:(usb.src == "1.9.1")&&(frame.len == 54)并导出筛选出后的分组usb.pcapng。
  • 分析数据段
    USB协议可以从USB协议了解详细的过程,而且其中包含了对数位板的介绍。这里主要看一下与这道题目相关的数位板:

需要对该数位板的数据格式做一个分析:x,y坐标以小端存储。结合之前在流量包中看到的数据,我们可以猜测到坐标存储的位置。红框为坐标高位bit,同一时间内变 化小于绿框(低位bit)变化率,橙框变化猜测为压力值,笔离开画板时压力变为0。

 

脚本

这里脚本放官方的脚本吧,我的那个有点不好看。。。

# coding:utf-8
import sys
import os
import numpy as np
import matplotlib.pyplot as plt
mousePositionX = 0
mousePositionY = 0
X = [] Y = []
DataFileName = "test.txt"
data = []
def main():
    global mousePositionX
    global mousePositionY
    # check argv
    if len(sys.argv) == 1:
         print "Usage : "
        print "        python UsbDigitizerHacker.py data.pcap [Conditions used
to sort]"
        print "Tips : "
        print "        To use this python2 script , you must install the
numpy,matplotlib first."
        print "        You can use `sudo pip install matplotlib numpy` to
install it"
exit(1)
    # get argv
    pcapFilePath = sys.argv[1]
    print pcapFilePath
    # get data of pcap
    if len(sys.argv)==2:
        command = "tshark -r '%s' -T fields -e usb.capdata > %s" % (
            pcapFilePath, DataFileName)
        print command
        os.system(command)
    if len(sys.argv)==3:
        Conditions=sys.argv[2]
        command = "tshark -r '%s' -T fields -e usb.capdata -Y '%s' > %s" % (
            pcapFilePath,Conditions, DataFileName)
        print command
        os.system(command)
    with open(DataFileName, "rb") as f:
        flag=1
for line in f:
if line[24:26] != "00": 
                print line
                data.append(line[0:-1])
for line in data:
        x0=int(line[6:8],16)
        x1=int(line[9:11],16)
        x=x0+x1*256
        y0=int(line[15:17],16)
        y1=int(line[18:20],16)
        y=y0+y1*256
        X.append(x)
        Y.append(-y)
    #draw
    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    ax1.set_title('[%s]' % (pcapFilePath))
    ax1.scatter(X, Y, c='r', marker='o')
    plt.savefig("out.png")
    plt.show()
    #clean temp data
    os.system("rm ./%s" % (DataFileName))
if __name__ == "__main__":
    main()

这里可以得到图如下所示:

 

 

哦!flag!我直接提交,然而。。。错误。
到此为止,我花了半天的时间去搞完这些操作,最后也得到一个高度仿真的flag。然而提示我错误?思路中断,,

 

第二天,早上醒来,突然想到flag.txt还没有用过!打开,直接复制去UTF-8解码(其实有点气急败坏了),发现不对。至此,比赛结束。然后,我发现这是emoji!!!!!去解码,key用上面那个图中的字符串:

 

 

 

然而,时间已经过去了,,,比赛结束了。

 

pcapng包太大,放不上来,想玩的可以去他们官方github里获取。


[培训]12月3日2020京麒网络安全大会《物联网安全攻防实战》训练营,正在火热报名中!地点:北京 · 新云南皇冠假日酒店

收藏
点赞0
打赏
分享
最新回复 (8)
雪    币: 5458
活跃值: 活跃值 (376)
能力值: ( LV5,RANK:72 )
在线值:
发帖
回帖
粉丝
qux 活跃值 2019-10-29 00:46
2
0
想请教一下,是怎么知道flag.txt中的内容是emoji的呀
雪    币: 8050
活跃值: 活跃值 (4794)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
有毒 活跃值 9 2019-10-29 12:35
3
0
txt里是unicode码,然后你去进行转换就会变成emoji了,这是转换网址 https://r12a.github.io/app-conversion/
雪    币: 8050
活跃值: 活跃值 (4794)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
有毒 活跃值 9 2019-10-29 12:36
4
0
qux 想请教一下,是怎么知道flag.txt中的内容是emoji的呀
txt里是unicode码,然后你去进行转换就会变成emoji了,这是转换网址 https://r12a.github.io/app-conversion/
雪    币: 5458
活跃值: 活跃值 (376)
能力值: ( LV5,RANK:72 )
在线值:
发帖
回帖
粉丝
qux 活跃值 2019-10-29 20:45
5
0
有毒 txt里是unicode码,然后你去进行转换就会变成emoji了,这是转换网址 https://r12a.github.io/app-conversion/
我是通过这样的方式知道的:一开始看不懂,但都是U+数字的形式,所以先复制一部分去搜,没有搜到结果,然后就复制第一个U+的形式去搜,结果是这样

这样才确定是emoji,然后搜"unicode emoji 转换",找一个能转换的网站,转一下就好了,我用的是这个网站:

https://www.ifreesite.com/unicode/


官方给的那个地址其实不太好搜得到
雪    币: 5458
活跃值: 活跃值 (376)
能力值: ( LV5,RANK:72 )
在线值:
发帖
回帖
粉丝
qux 活跃值 2019-10-29 21:53
6
0
"发现的数位板的src为1.9.1,frame长度为54"  
这里不太懂,是怎么发现的呢?
雪    币: 8050
活跃值: 活跃值 (4794)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
有毒 活跃值 9 2019-10-30 10:38
7
0
qux "发现的数位板的src为1.9.1,frame长度为54" 这里不太懂,是怎么发现的呢?
需要你去看一下USB协议的具体结构,然后去了解数位板。流量包里大部分数位板流量的frame长度都是54,src就在流量包里直接看的
雪    币: 8050
活跃值: 活跃值 (4794)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
有毒 活跃值 9 2019-10-30 10:39
8
0
qux 我是通过这样的方式知道的:一开始看不懂,但都是U+数字的形式,所以先复制一部分去搜,没有搜到结果,然后就复制第一个U+的形式去搜,结果是这样这样才确定是emoji,然后搜"unicode e ...
这个地址是我们队里一个专门做misc的人提供的,你玩的多了其实一眼就看出来了,使用的工具和网站也都分类统计好了
雪    币: 5458
活跃值: 活跃值 (376)
能力值: ( LV5,RANK:72 )
在线值:
发帖
回帖
粉丝
qux 活跃值 2019-10-31 23:57
9
0
了解了,非常感谢
游客
登录 | 注册 方可回帖
返回