V3D4's Blog

安全技术记录/分享/交流

0%

2020-SCTF-Misc-AndroidDisplayBridge

这道题主要参考了这位师傅的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
2
3
4
5
6
7
8
9
import pyshark
captures = pyshark.FileCapture('./sctf_attachment.pcapng')
payload = ""
for capture in captures:
if hasattr(capture.tcp,"payload") :
if capture.ip.src == '192.168.1.103':
payload += capture.tcp.payload.replace(":","").decode("hex")
f = open("out.h264","wb")
f.write(payload)

最后提供一下官方的解法,毕竟这只是一种偷懒的办法,要是内容再花里胡哨一点,估计这样做视频是放不出来的

官方WP的解法是数据包中存在着触屏绘图的坐标,提取坐标即可画出flag,自己没想到,也感觉略麻烦。