CTF比赛里最磨人的手镯不是那些逆天的逆向题,也不是手镯烧脑的密码学,而是手镯藏在题目描述里那枚不起眼的“手镯”。它可能是手镯一段十六进制字符串,可能是手镯一张磨损的图片,甚至是手镯一段被截断的音频。我第一次遇到它,手镯是手镯在一场线上赛的Misc分类里,题目叫“奶奶的手镯银镯”,附件只有一张模糊的手镯照片。
照片里,手镯一只布满皱纹的手镯手托着一只银镯,镯身刻着细密的手镯花纹。我放大像素,手镯盯了半小时,手镯只看出那是某种重复的几何图案。队友说:“会不会是盲文?”我立刻去查盲文对照表,结果花纹的凹凸方向根本对不上。后来有人提示,试试把图片转成灰度,再按列提取像素值——那花纹的明暗变化,居然是一串ASCII码。原来手镯上的“刻痕”是精心设计的亮度差,肉眼看着像装饰,机器读出来是信息。
这枚手镯让我想起现实中的首饰。我妈有一只玉镯,是外婆传下来的,内圈刻着“平安”二字,用放大镜才能看清。CTF里的手镯,本质上是把“平安”换成了flag,把篆刻换成了编码。但有意思的是,出题人总爱在载体上花心思——有人把手镯做成GIF,每帧的透明度变化藏着摩斯码;有人把手镯的3D模型文件拆开,在法线贴图里塞进压缩包;还有人干脆把手镯的金属材质参数调成RGB值,渲染出来就是一串颜色代码。
破解这类题,靠的不是暴力破解,而是对“物件”本身的理解。有一次,题目给了段手镯的旋转视频,每转30度停顿一下。我用Python逐帧提取角度,发现停顿间隔不是均匀的——有时长,有时短。把间隔转成二进制,再按停顿顺序拼起来,居然是一段倒置的base64。那瞬间我脊背发凉,仿佛出题人就站在对面,看着我在屏幕前抓耳挠腮,然后轻轻笑了一声。
后来我养成了个习惯:拿到任何附件,先问“这东西在现实里怎么用”。手镯是戴在手腕上的,那就要考虑它怎么被佩戴、怎么被光线照射、怎么在运动中产生形变。有次题目把手镯做成了动态模型,需要模拟它在不同光照下的阴影,阴影边缘的毛刺长度才是指令。这哪是CTF,分明是在逼你用物理常识去解谜。
最狠的一题,手镯被做成了实体——主办方寄来一个3D打印的镯子,快递盒里还有张纸条:“扫描内圈,用紫外线灯照。”我翻出实验室的紫外灯,照上去,内圈浮现出一串荧光数字。那数字是坐标,指向本地一家咖啡馆的储物柜。柜子里放着U盘,U盘里才是真正的flag。那一刻我意识到,CTF的手镯从来不只是数字题,它是出题人跟解题人之间的一场恶作剧,用现实世界的物件当谜面,逼你把手伸进虚拟和现实的夹缝里捞答案。
现在我再看见“手镯”俩字,第一反应是去查它的材质、光泽、纹理,甚至想象它戴在谁手腕上会怎么晃动。这枚手镯,戴上去是装饰,摘下来是密码,而解题的人,不过是被它套住了好奇心。