array(5) { ["chapterid"]=> string(8) "49409221" ["articleid"]=> string(7) "7300050" ["chaptername"]=> string(8) "第28章" ["content"]=> string(3617) "赵一鸣没接话。他把折断的牙签拨到一边,看了一眼林墨。那个眼神里有试探的成分——不是在挑衅,是在确认刚才的事到底过没过去。

林墨端起水杯喝了一口,没看他。

五个人吃完饭,老板收了六十二块钱。苏晚晴掏手机扫码。赵一鸣站在门口等,手插口袋里,视线落在路面上一只搬面包屑的蚂蚁上。看了几秒,抬起头。

"走吧。"他说。

声音比中午之前低了一个调。但他说了"走吧"——不是"走"也不是"你们先走"。是要一起走的意思。

林墨跟上去的时候,苏晚晴在他旁边轻声说了一句:"他缓过来了。"

"嗯。"

"你下次能不能——"

"我知道。"林墨说。"换个方式。"

苏晚晴看了他一眼,没再说了。她知道"我知道"这三个字在林墨嘴里的分量——不是敷衍,是真的记住了。

下午两点,交叉训练。

每个人从非主攻方向选两道题。目的是补短板——实战比赛里,当你的主攻方向卡住了,你得能帮队友分担。方远行说过一句话:"五个专才不如五个通才加一个专长。"交叉训练就是逼你走出舒适区。

林墨选了密码学和杂项。

密码学题是RSA共模攻击。RSA是目前最常用的公钥加密算法——你可以把它想象成一把挂锁:公钥是锁,谁都能锁上;私钥是钥匙,只有你有。题目给了同一个明文用同一把锁、但不同的加密参数加密了两次。林墨需要利用这两个加密结果之间的关系,反推出原始明文。数学上不难——当两个加密参数互素时,可以用一个叫"扩展欧几里得算法"的方法把它们组合起来,消掉加密、还原明文。十分钟搞定。

杂项题给了一个网络抓包文件。抓包文件记录了一段时间内网络上传的所有数据——像一段电话录音,但录的是电脑之间的对话。林墨用Wireshark这个工具打开文件,看到大部分流量是加密的——HTTPS,内容看不到。但他注意到一些DNS查询异常:有些域名的子域名特别长,长得不正常。正常的域名是"www.example.com",这些域名是"aGVsbG8gd29ybGQ.example.com"——前面那串乱码是base64编码。有人在用DNS查询来偷传数据:把信息编码进域名里,让它们看起来像普通的网页访问。这就是DNS隧道——像在明信片上写暗号,邮局只看到正常的明信片,但收信人知道怎么读。

林墨在DNS响应里找到了编码后的flag,解码,提交。三十五分钟,两道题清完。

周可然选了Web和Pwn。

Web题她用sqlmap跑通了。sqlmap是一个自动化的SQL注入工具——SQL注入就是利用网站输入框的漏洞,往数据库里塞特殊字符,骗它执行你想要的命令。题目网站的搜索框没有过滤用户输入,周可然让sqlmap自动探测漏洞、提取数据,五分钟拿到了flag。比林墨预想的快——周可然在Web方向的基础比他以为的要好。

Pwn题她选了一道二星的栈溢出。栈溢出是最基础的二进制漏洞——程序在接收输入时没有检查长度,输入太长就会覆盖掉程序内存里关键的数据,比如函数的返回地址。覆盖了返回地址,程序就会跳到你指定的位置执行。周可然没有用现成的工具库——她用C语言手写了攻击代码,逐个字节地构造payload,每一步都写了注释。她的C代码风格很老派:变量名全小写加下划线,函数名不超过八个字符,每个函数都有块注释。" ["create_time"]=> string(10) "1785963705" }