强网杯 2022 Quals Writeup ¶
约 864 个字 12 行代码 1 张图片 预计阅读时间 3 分钟
Abstract
misc 很少,只做了碟影重重一道题,纯纯的傻逼题。一层一层毫无意义地硬套娃,做了好长好长时间,最后差几分钟没做出来,真的破防
(╯°□°)╯︵ ┻━┻
碟影重重 ¶
首先题目给了一个加密压缩包和一个流量包
压缩包结尾附加信息 Password is md5(api address)
流量包看不出什么名堂,直到给了第一个 hint:vmess 流量。于是就去翻看 vmess 的文档,结果文档写的不仅💩一样还全 ** 是错的。被迫看 v2ray 的源码,但 v2ray 的源码还是 go 写的,这难看的语言真的要给我看吐了。翻找到了 rust 写的 leaf 项目,里面有 vmess 相关的东西,看的很舒适。最后看源码看出来的 vmess 协议内容在 vmess 协议 页面
根据协议详细信息解码请求流量,得到:
解码响应流量得到一个很长的 html,里面实际作用是用 base64 解码得到一个 doc 文档并下载。通过解码或者打开 html 都可以得到这个 doc 文档。不过其中包含了病毒宏,可能会被防火墙清理(mac 不会)
将扩展名改为 .zip 并解压可以得到宏(或者进入 Word 打开宏编辑器)分析了好久那一堆混淆的宏,没什么进展,大概就是执行了一个 dll,找到后逆也没逆到什么
考虑到防火墙会自动清理,以及宏的写法和 doc,这应该是一个老病毒,于是结合 dll 的 sha256 值搜索了一下,果然得到了分析:https://any.run/report/0d7aa23a72d22dcf47f8723c58d101b3b113cbc79dd407a6fac0e65d67076ea1/2211f4a0-81e4-432d-87a8-c7c285a5a919
里面就有这个 api address:api.ipify.org,md5 后得到密码 08229f4052dde89671134f1784bed2d6
解压后得到一个二进制文件,里面可以看到 "GobThis is a Gob File!Time2022-07-19 14:49:56PNG File",是 go 的序列化文件,使用 drosseau/degob 反序列化,得到 png 的逐字节值
不过这些值写入二进制文件后并不能打开图片,又卡住了,有了第三个 hint:为了保证数据的机密性,他把数据随机打乱了。很无语,就纯纯的傻逼题,虽然说有时间种子的暗示,但并不强烈,纯纯傻逼
用 go 写一个随机打乱的程序,按照打乱的逻辑反过来,就可以恢复 png 图片。不过写令我反感的 go 代码有够烦的
图片打开之后是 flag not here 文字。又是很无语,到这了还 ** 套娃
丢到 stegsolve 里,看不出什么东西,red green plane 有奇怪的锯齿状。后来发现 alpha 通道都是有值的,可能会通过 alpha 通道传信息(不过这时比赛已经快结束了)
用 PIL 提取 alpha 通道的值,果然有很多不同值,不过大部分还是 0xff 和 0x00,所以考虑去掉 0xff 和 0x00 看一看,将图片展开成一维,然后剔除 ff 和 00 得到字节形式的一堆 flag:
img = Image.open("flag.png")
arr = np.array(img)
width, height = img.size
bytes(arr[:,:,3].reshape(width*height)).replace(b"\xff", b"").replace(b"\x00", b"")
# b'flag{898161df-fabf-4757-82b6-ffe407c69475}flag{898161df-f...
细数一下这题有几层:
- 解码 vmess 流量
- 找到 doc 中的宏
- 通过分析宏找到病毒调用的 api 地址
- 解码 gob 文件
- 通过时间随机种子恢复乱序的 png 文件
- png alpha 通道隐写
很多步骤没有充足的提示,而且很多是纯纯没必要的硬套。没有难题可以不出,不要用这种题恶心选手……
创建日期: 2022年9月21日 01:16:49