这道题主要参考了这位师傅的wp,挂个链接先
SCTF 2020 AndroidDisplayBridge
- 题目描述:Finding his android phone’s touchscreen not working, he logged in his computer and painted something…
首先题目给了一个流量包,打开发现里面是tcp协议的一些流量,直接追踪看下
发现关键内容/data/local/tmp/scrcpy-server.jar,百度一下可以知道,是一款投屏软件,叫scrcpy
根据这篇知乎上的文章,可以知道scrcpy的视频流是H264编码,于是就去了解了下h264编码的视频格式
这里引用下参考wp的师傅的话
原来H264是一种视频编码,其中是没有声音信息的,如果在配上一段AAC编码的音频,就能封装出一个完整有图像有声音的MP4视频啦。如果去显示一下自己电脑中MP4视频的详细信息,一般也会看到视频和音频的编码方式。所以,知道未经过封装的H264的数据长什么样我们就能从数据包中把他提取出来。那么这个家伙长啥样呢?
根据上面链接里了解到的,h264视频的文件头是00 00 00 01 67,而在数据包中尝试搜索了一下,发现确实是有这个开头的
所以现在要做的就是尝试将这个视频导出来
这里可以用一个偷懒的办法
虽然在一整个数据包中,视频流数据上下还穿插着adb的命令,不过我记得视频流编码的容错性非常强,而且如果播放器足够强大,花了呼哨的视频也能放出人来。所以我就直接导出了tcp流,选择数据为手机端发送,然后以原始数据导出,就获得了包含有H264的二进制文件
就是直接选择5555端口发送出去的数据,即手机发送过去的数据,然后用原始数据的方式导出
导出后需要注意,这时视频还是不能直接播放的,以为文件头前还有多余内容,需要删掉才行
将00 00 00 01 67 前的内容删掉后,发现视频即可正常播放
最后得到flag
1 | flag:SCTF{better_access_with_scrcpy} |
也可以使用如下脚本将数据包中的视频导出:
1 | import pyshark |
最后提供一下官方的解法,毕竟这只是一种偷懒的办法,要是内容再花里胡哨一点,估计这样做视频是放不出来的
官方WP的解法是数据包中存在着触屏绘图的坐标,提取坐标即可画出flag,自己没想到,也感觉略麻烦。