Skip to content

Latest commit

 

History

History
86 lines (56 loc) · 5.32 KB

File metadata and controls

86 lines (56 loc) · 5.32 KB

奶奶的睡前 flag 故事

题解作者:lly

出题人、验题人、文案设计等:见 Hackergame 2023 幕后工作人员

题目描述

  • 题目分类:general

  • 题目分值:150

包含 AI 辅助创作

(以下内容由 GPT 辅助编写,如有雷同纯属巧合)

晴空万里的假期终于拍了拍翅膀飞来了。对于一心想扔掉教材、砸掉闹钟、跃向世界的 L 同学来说,期待了整整三年的跨国旅游大业终于是时候启动了,还能巧妙地顺带着做个美满的老友记。

可是,哎哟喂,他刚踩上波光粼粼的金沙海滩,那他最疼爱的华为手机就跟着海风一起去约会了大海,连他的钱包也在这场未知探索之旅中神秘失踪。

「这个地方怎么连个华为手机都不卖。若是买个苹果手机,心疼的是它连个实体 SIM 卡槽都藏起来了,回国肯定成了个大摆设。不如来个谷歌的『亲儿子』?」L 同学踌躇满志地嘀咕道。

那时,像是上天的安排,「咱这儿正好有个**谷歌『亲儿子』**的老手机,你拿去逍遥吧」。

L 同学满眼星光地接过,连系统都没心思升级,就开始疯狂安装那个久闻大名的 GPT 程序,甚至雀跃地在群里晒出一张跟 GPT 对话的精彩截图,一时间成为了群里的焦点人物。

screenshot.png

你能从这张图片里找到 flag 吗?

题解

这道题是 @taoky 的 idea,@zzh1996 的文案。我用一台 Pixel 3 完成了实现。

搜索「谷歌『亲儿子』」,可以发现指的是 Google Pixel 手机。

搜索 Pixel 截图 bug,可以发现很多新闻报道:Pixel 手机自带的系统截图工具存在漏洞,裁剪图片并不会删除原图,而是将裁剪后的图片的数据直接写在原图的开头,覆盖原先的数据,此时原图未被覆盖的部分仍然可以被恢复。

从报道中还可以找到在线恢复网站:acropalypse,因为提示是老手机,我们从旧的型号开始尝试即可,发现 Pixel 3 可以成功恢复图片。

new

这样就可以拿到 flag 了。

下面分析一下漏洞原理。

如果对这个漏洞一无所知,可以使用 zsteg 或其他图片隐写工具先分析一下截图:

$ zsteg screenshot.png
[?] 184073 bytes of extra data after image end (IEND), offset = 0x4e908
extradata:0         ..
    00000000: fd bb a6 a6 d6 dc 79 f3  99 f7 17 16 14 6e db ba  |......y......n..|
    00000010: 89 ef 4f a3 51 bd 79 fd  d2 6c de 2c 72 a3 d2 1b  |..O.Q.y..l.,r...|
    00000020: af 1f b0 f7 50 6d ed fa  1a 1a 9a ed 3b 74 ac f3  |....Pm......;t..|
    00000030: 80 f2 f2 0a bc d4 1b 7a  f6 8c a5 c5 5c b2 ed e3  |.......z....\...|
    00000040: 17 30 d5 70 06 c7 62 97  ae de 1a 32 64 38 f7 43  |.0.p..b....2d8.C|
    00000050: 7d fd 9a 30 a8 7f dd 63  cc 84 50 ef de 7d 8f 9f  |}..0...c..P..}..|
    00000060: 0c b1 5b 62 f3 f3 e7 8f  bb 77 c2 c7 8e 19 1e b0  |..[b.....w......|
    00000070: ef 10 09 cb ff 0d 2d a4  5b 70 f9 73 e3 4e 4e 56  |......-.[p.s.NNV|
    00000080: ae 5e e5 b3 b2 7e 06 9f  39 c9 bd 0c 9d 4e ef d8  |.^...~..9....N..|
    00000090: 51 ad 5d fb 0e ad 5a b5  56 51 51 55 56 56 6e d3  |Q.]...Z.VQQUVVn.|
    000000a0: b6 5d bb 76 ed 5b b5 6e  a3 a4 a4 dc c0 51 40 bc  |.].v.[.n.....Q@.|
    000000b0: 90 fd f5 43 95 94 d6 cc  51 51 53 ef 7c ee fc 55  |...C....QQS.|..U|
    000000c0: a3 e9 06 f1 f1 71 c1 67  4e 36 6b d6 cc 6f d7 be  |.....q.gN6k..o..|
    000000d0: da 1e 74 e4 e5 e5 99 db  b6 01 20 37 37 87 fc f1  |..t....... 77...|
    000000e0: d2 e9 74 2d ae 23 2d e5  e4 e5 00 a0 aa aa 8a 94  |..t-.#-.........|
    000000f0: a7 4e e0 cf da bb c7 ef  6b 62 42 50 70 18 cb 63  |.N......kbBPp..c|

提示说 extra data after image end (IEND),搜索得知 IEND 是 PNG 图片的结束标识,对应的十六进制是 49454e44。我们预览或打开图片时,图片编辑器读到这里的结束标识就停止读取了,所以图片看起来是正常的,但实际上结束标识后面还有数据。如果再查看真正的文件尾,可以确定剩余的数据是一张 PNG 图片的一部分(存在 IEND)。

$ xxd screenshot.png | tail -n 3
0007b7f0: a800 0000 d111 2a00 0040 74fe 1f9f 5f51  ......*..@t..._Q
0007b800: c363 0b82 ba00 0000 0049 454e 44ae 4260  .c.......IEND.B`
0007b810: 82

这就可以说明裁剪后的截图是直接覆盖了原图的开头,而原图剩余的数据仍然在裁剪后的图片的文件末尾。剩余的数据因为缺失了 PNG 的头部,而且也不一定按照 PNG 的 chunk 对齐,所以无法直接用图片查看器打开,但我们可以借助恢复工具恢复。如果你是 PNG 格式高手也可以尝试手写恢复代码

其他

值得一提的,除了旧版 Google Pixel 以外,Windows 自带的截图工具也存在过这种漏洞。对于已有的存在原图数据的裁剪后截图,部分网站会通过自动根据文件尾截断上传图片的方式缓解这一问题。

在图片的末尾隐藏数据其实不是什么新鲜的主意,如果你在(大约十年前)就频繁网上冲浪的话,很可能会在一些论坛里见过下载后改名 RAR 后缀可以顺利解压出隐藏文件的图片,这和本题的原理是相似的。