论如何正确收一个新年解谜红包

注意:题目中出现的链接需要替换后才能访问redpacket.kaaass.net=>redpacket.kaaass.net/archived/2018/。

为了给大家在无聊的新年找点事玩,我在BCPU和另一个群发了个解谜红包。由于支付宝可以发口令红包,于是只用藏8位数字就行了。题目很简单:redpacket.kaaass.net。现在我就来讲讲怎么收这个红包吧23333

Stage 1

首先就是看redpacket.kaaass.net啦,浏览器打开发现“POST password!”。猜测应该是需要POST方法,并带上param。那么param是啥?再看看html:

<p>POST <a name="passwd" val="FOUND THAT TXT!!!">password</a>!</p>

那就是passwd了!随便POST一个,发现返回:“Param passwd should be a number!!!!”。那随便试试数字,得到返回:“What if the password isn’t here?”。根据提示,密码应该不在这个页面。注意到之前val处是“FOUND THAT TXT!!!”,于是我们就得到了本关重点“TXT”。很多人以为是文本文档,于是就疯狂的尝试,甚至log里还记录了“/static/qaq.txt”这样的请求。其实这个TXT指的是DNS的TXT记录。解析redpacket.kaaass.net的TXT记录得到“a2FhYXNzLm5ldC9yZWRwYWNrZXQv”。这一串实际上是base64,解码得到“kaaass.net/redpacket/”。打开发现提示“GET ttl”,联想之前的POST,当然就是发一个GET请求并附上ttl了。不过ttl究竟是什么?很多人都以为是数据包的ttl,然而其实是TXT记录的TTL。GET之后得到下一关链接“redpacket.kaaass.net/welcomestage2/”。

Stage 2

如果使用浏览器打开,那整页只有一串“6H/cane3=trkaEs?4Teeattc0pdts/ao4:p.stgd/aK.hee”。不过标题还有一个提示(其实是提示的提示):“I’m feeling HUNGRY!!!!! – Stage 2”。猜测和COOKIE有关,检查发现网页设置了3个COOKIE。

hint1:2ab => a\nb => ab

hint2:3uuddlrlrbaba => uudd\nlrlr\nbaba\n => ulburadlbdra

hint3:4BcpuCheersUp => Bcp\nuCh\neer\nsUp => BuescCeUphrp

按照提示,前面的数字代表需要分的行数。分行后:

a
b => ab

uudd
lrlr
baba => ulburadlbdra

Bcp
uCh
eer
sUp => BuescCeUphrp

发现就是竖着读!回到我们的一大串字符。然而这一串字符有46字,并不能被6整除。这里是一个提示里没有包含的规则——前几行可以多一个字符,不过是能推理出来的,理由如下:

  1. 读取方法为竖着读取。所以最后一列可以不填满。
  2. 可以猜测最后得到的是链接。由于第一位字母不会在变换中变动,所以第一位就是H。考虑到是链接,猜测开头是Http://。这样也可以分得出来。

总之最后得到:

6
H/cane3=
trkaEs?4
Teeattc0
pdts/ao4
:p.stgd
/aK.hee => HtTp://redpacket.Kaaass.nEt/thestage3?code=404

于是成功进入第3关!

P.S.虾米音乐的url就是通过这种方式编码的。

Stage 3

当头就是404。好像有一些人就放弃了233333。不过仔细看页面里,有一句“LEAVE me now!!!!!!”。这肯定是提示,不过暂时用不上。想到参数里有个code,而且提交的就是404……如果改掉这个呢?随便试一试就会发现,输入什么状态码就会返回什么!

那“LEAVE me now!!!!!!”呢?在HTTP状态码里,和“LEAVE”有关系的就是几个跳转的状态码。由于不是POST方法,所以只有301或302是可以的。跳转的网页提示“What do you need if you want to drink a cup of tea? BTW, I know you already had had some COOKIEs :)”。emmmm……

没错,这就是我最喜欢的一个解谜了!答案就是一个神奇的HTTP状态码:“418 I’m a teapot”。这个状态码本来是一个愚人节玩笑。我之所以喜欢这个谜题还因为扯上了上一关的COOKIE。返回里说“I don’t think you could get the PA55W0RD.”。奇怪的拼写加上特异的大写,“PA55W0RD”就是密码啦!不过仔细一看发现提示“Repeat me 4 times.”,这里其实原本不是这样的,后文会说。那么这是什么密码呢?

还记得最开始的谜题吗?没错,我们回来了!不过POST之后发现“PA55W0RDPA55W0RDPA55W0RDPA55W0RD”是错的……提示还是“Param passwd should be a number!!!!”,没错,密码就是“550550550550”(o和O在Arial等等字体里比较像,这里是个大坑233333)。于是你进入了最后一关。

Stage 4

那一大串返回足足有100多k。稍稍观察后,会发现这是base64编码的(尤其是观察最后的==,base64中用于占位)。其实这是一张base64编码的图片。没错就是我独角兽老婆!

唯一的提示就是“Unpack me”,扣屏幕当然是没用哒!那么如何Unpack这个礼物呢……猜测是压缩包?没错就是压缩包!不过其实这里还有一些理由。文件开头是FF D8,推测这是jpeg格式文件。于是我们可以去寻找文件尾部FF D9。找到后,观察Offset 00013BD5处是50 4B 03 04,这事实上就是zip的文件头。到这里还不是很踏实,我们去找找EOCD的标志50 4B 05 06。果然在Offset 00014029处找到了!没错这就是zip文件!接下来可以把这段复制出来,也可以直接把文件后缀改成zip。对了,多说一句,@天台 dalao从图片大小就看出问题了,好厉害。

然而有密码。不过好在有提示“Password Is 3tDcpohertnesii”,眼熟不?解码得到theDescription,那我们开开心心的feed进去……嗯?密码不对!没错,这是提示。然而压缩包的描述里啥都没有。那么所谓描述是什么呢?答案是——图片描述(右击属性)。密码是:ILOVZ23!。

加压后我们得到了两个script,分别是python和java语言编写的。内容相同,只不过为了让不懂python的人也能看懂,所以增加了java语言。取python脚本如下:

#!/usr/bin/env python
# encoding: utf-8

def xor(a, b):
    return ''.join((lambda cur_char:[ chr(ord(x[0]) ^ ord(x[1])) for x in cur_char ])(zip(a, b)))

if __name__ == '__main__':
    str = input('Guess a redpacket code: ')
    if (xor(str, 'ilovbcpu') == '[]XO[ZBG'):
        print('Congratulation!');

(求不轻喷str这个命名,python渣)

因为XOR的特性,直接把ilovbcpu和[]XO[ZBG取异或就行。至此我们成功的解出了红包。服务器我暂时会保留,有兴趣的dalao可以走一遍流程。

P.S.最后一关的设计来源于@CancerGary dalao(博客见最后致谢),特此感谢!

一些有趣的事情

  • 总共3位dalao解出了红包。不过20的拼手气红包最后退还了12.4……虽然后来平分了余款
  • 最开始“重复4次”的那个提示事实上原来是“这就是密码”。至于为什么改掉了……因为有dalao暴力得到了密码(那时候密码只有550三位)。所以后来只能改成550550550550了23333
  • 为啥图片是独角兽?因为之前30勋章兑换我错!过!了!
  • 为啥密码是Z23?因为是真爱呀~PRPRPRPRPR
  • 根据log显示,很多dalao卡在了S3。看来wiki真的很重要。
  • 询问我的,我只会把网页里的提示里重复一遍。

你以为就这样结束了?

不不不,我的确是说红包是20拼手气,但我有说只有一个么?dalao们难道不觉得有些提示很没头没脑吗?

隐藏红包1 – Stage3

最好想到的隐藏红包在Stage3。至于这些隐藏红包的解法,我希望众dalao能自己尝试探索。我在这里设置了回复显示。

隐藏红包2 – Stage2

既然有了一个,为什么不能有第二个呢?而且既然Stage3可以有,那Stage2为什么不能有?因为我把第二个隐藏红包的入口藏得很特别,所以隐藏红包1的存在很大程度上暗示了这个红包的存在。而且,暗示不仅仅只有这一个!老规矩,回复可见。不过先给想尝试的dalao留个提示:这个红包发在BCPU群里,本组织的主页可以看我博客右侧的友链第一个。

隐藏红包3 – Stage1

这个红包最后没发(取消了),因为太简单。不过我也挂上去了。

P.S.由于不可抗力,本文原文实际上已经丢失。其他部分通过Google快照找回,然而隐藏的部分实在是无能为力了……所以你现在看到的是我后来补写(其实还没补)的内容,可能非常不连贯,还请多多理解!

2018.7.26 22:16 – 一下午把整个过程都重新上线,又把隐藏关重写了一遍,虽然没人看,权当纪念了,如果你有缘看到这行字,不妨发个评论(虽然不发评论也看不到这行字)。啥?你说为啥是今天填坑?(手动滑稽)

隐藏红包1

不知道你看wiki的时候有没有注意到这个状态码:402 Payment Required。没错,这就是这个红包的入口了。其实我个人觉得这个提示还挺明显的,而且也确实有人想到了。输入之后,会提示“Want to require a payment? What about the /secretstage”,于是我们就找到了隐藏关卡的入口。直接访问,提示“GET me you feeling!”。嘛……虽然不知道提交什么,反正随便GET一个feeling先~提交后返回“233 You Kidding Me”。这个结构……不就是状态码的结构吗?!于是回到第三关,输入233,提示“You could post you “feeling” now! :)”。这回可以顺利的POST了,成功后返回“Thank you, and … LEAVE me now!!!!!!”。于是,回到secretstage,再次GET提交与刚刚相同的feeling即可。

然后返回如下内容:

redpacket.kaaass.net/secretstage/question/?ind=1
redpacket.kaaass.net/secretstage/question/?ind=2
MERGE THEM

没错,这才是这关的本体!我们先来看问题1。没错,现在开始才是真的纯解谜。第一关的谜题是“OLD NEWS(旧新闻)”,正文只有“M29 founded by Walter Colquitt & Luke Welsh.”,提示是“abcdef => deab”。解题方法很简单,拖进百度搜一搜,第一条就是。没错,就是梅森素数。M29指的就是第29个梅森素数,而根据提示的6位,我们取其p110503按照提示组合,得到5011。

第二关的解谜是“OLD DOCUMENT(旧文档)”,内容是:

Profile for Datagram Congestion Control Protocol (DCCP)
Congestion ID 4: TCP-Friendly Rate Control for Small Packets (TFRC-SP)

解法还是暴力百度,其实这就是RFC文档的标题。不过这次只搜第一行可不行,这文档标题其实有两行,是RFC5622。于是拼接即可得到红包码50115622。

有趣的事实

  • 事实上,是现有233才有这个隐藏红包的。可以看到提交完的提示是“LEAVE ME NOW”,这不仅是为了不让试出233的人知道隐藏红包的存在,更因为隐藏红包没有的时候这就被设计出来了。
  • 再次输入feeling是防皮措施。事实上,确实有人试出来了233。比如天台dalao,而且后来的隐藏红包关,还忘记了23333
  • 本来梅森素数那个是设计成取梅森素数的第xx位的,但是考虑到实在没多少人发现隐藏关,能简单点就简单点好了。

隐藏红包2

第二个隐藏红包藏得很深,需要隐藏红包1暗示其存在。其实说来也简单,Stage2的那些提示难道什么用都没有吗?突破口在BcpuCheersUp。没错,这里用到了BCPU的官网bcpu.tech。本题地址就是Bcpu.tech/CheersUp了。(由于原站数据丢失,维护者KAAAsS特别懒的原因,bcpu.tech已经迎来闭店之日,所以只能查看redpacket.kaaass.net/CheersUp了)打开之后,发现是一个要求输入神秘字符串的网页。

JS用了aaencode进行编码,不过这种编码基本上就是卖个萌。JS的大致内容就是记录键盘动作并保存,最后提交的时候一同提交,这算是一个提醒。再一个就是上一次已经用了一个hint,还需要使用剩下的hint。最后的提醒就是input的name——contra(魂斗罗)。所以就要用到hint2了,按照ulburadlbdra的顺序输入,提交就能获得一串字符“c6554e5d3be06a74f07a21a04a23e66c”。于是我们又是面对一串谜一样的字符串了。这个谜题骚就骚在,原本众dalao可能都在用Postman类的工具,很容易看出问题,而这里答案返回的形式是ajax,于是很容易就会漏掉什么信息。没错,就是响应头!经过查看,这里多返回了两个自定义头:

X-Encoding-With: AES_ECB
X-Key-Length: 16

接下来,用AES解码就没问题了……吗?密钥是啥?其实这里提示还是很多,一个是X-Key-Length说明Key长度是16。另一个就是,只剩下hint1没有用到了。所以密钥就是ab了,这里注意前往别用网上的解码,要么是错的,要么结果base64。解码得到红包码:86774122。

有趣的事实

  • 最开始连Bcpu都强制要求B大写,不过后来发现有BUG,于是就取消了。
  • 原本的密码只有bbaa,但是我后来感觉一是提示只有contra,不明显,二是太短容易被暴力过。于是就出现了第一版,那时是点按方向键会直接打出对应的箭头。然而,我又觉得提示过于明显,所以增加了一层解谜,即不同的方向键点按会出现另一些方向符号。然而,这一次又设计的太难了。于是最后折衷,就决定闷声大记录,这是坠吼的。
  • 只有天台dalao最终到达了这里

隐藏红包3

最后一个红包真的太简单了哈哈哈哈。还记得第一关让你GET tll吗?那就老老实实发个GET tll咯。返回的内容很长:

2.3
0.3
2.5
2.1
2.5
1.9
0.6
0.5
0.1
2.3
1.9
0.0
0.6
0.9
0.2
2.4
0.3
2.8
0.5
0.1
1.9
2.6
2.1
0.0

一串小数,结合ttl的另一个意思——TTL电平。没错,大于2.4V就是高电平1,低于0.4V就是低电平0,一组合就得到了二进制数字:101111000110000101001110。转为十进制得到12345678,因为我并没有发这个红包,权当娱乐啦23333

有趣的事实

  • 原本每一行最后都有V,重写文章的时候我删掉了
  • 这关坑在入口,其实本身可以说是三关最简单的了
  • 本来想在二进制上做手脚,但是真的想不出来了,时间有限QAQ
  • 悄悄放个卫星,新一年的红包我有脑洞了

还有些有趣的事情

到截止时间,彩蛋里收到了这些留言:

  • I’m so weak. By Terrace
  • 233
  • I’m KAAAsS lol
  • WTF

都是卖萌(←好啦你最萌!)

最后

希望大家玩的开心!祝大家新年快乐!

致谢

SuperFashi dalao:看了dalao的博客里关于2016年红包的想法才有了这次红包

CancerGary dalao:最后一关创意来自dalao

天台 dalao:感谢dalao辣么认真的解谜QAQ

分享到

KAAAsS

喜欢二次元的程序员,喜欢发发教程,或者偶尔开坑。(←然而并不打算填)

相关日志

  1. 没有图片

    2016.02.14

    日本人名研究
  2. 没有图片
  3. 没有图片
  4. 没有图片
  5. 没有图片

评论

  1. AD是我身下受 2018.02.17 10:47下午

    沙发!

  2. 泡面蟹 2018.02.18 1:59下午

    那个暴力猜出密码的就是我23333
    思路比较不一样,结果就是直接从S1跳到了S4

  3. __Ressed__ 2019.02.11 12:18上午

    试图玩今年隐藏关的我回来看去年的了2333

  4. __Ressed__ 2019.02.14 6:57下午

    莫非要点了“抱歉! 需要 评论本文 才能阅读隐藏内容。”里的评论本文才能看见吗…

    • __Ressed__ 2019.02.14 7:05下午

      还是看不见…

      • KAAAsS 2019.02.14 8:23下午

        修复了……原来wp现在评论没有cookie记录了(也有可能我干了啥整没了)

        • Paulzzh 2019.02.17 2:51上午

          嗯现在可以看到了,有个问题。。是不是有个关于四暗刻单骑的隐藏关***,以及随处可见的麻将痕迹是怎么回事23333(这个是上面那位ressed发现的)

          • KAAAsS 2019.02.17 12:42下午

            那是今年的隐藏啦,这篇是去年的。https://blog.kaaass.net/archives/1085
            关于那个Ressed和我交流了,不过那并不是全部w

      • Paulzzh 2019.02.17 2:44上午

        emmmm你现在能看到了吗,反正我还是点不开…

在此评论中不能使用 HTML 标签。