榜书既下|诸公响应
在这个8月份的尾巴,格尔软件又一次迎来了令人期待的年度编程竞赛,本次竞赛分为三轮,难度逐轮增加,既考验团队的协作能力,又考验团队的技术底蕴。赛事一经推出,受到了全体研发人员的热烈响应。因为是自由成组的团队赛,大家纷纷自发组队报名,一个个都摩拳擦掌、跃跃欲试。
最终,我们收获了54支参赛队伍,他们分布在各个地域的各个产品线:北京、上海、南京、西安、成都......网关、PKI、4A、邮件、签名......好一幅诸侯争霸的场景!
战斗 | 一触即发
8月23日19时整,随着组织者的一声令下,战斗打响了第一枪。大家都像脱缰的野马,全力投入到比赛中,我方好几名队友就冲在前面。因为题目只发给了组长,而他又没有第一时间发到群里,留下出差在外的我在那里干着急。当时的心理状态,颇有一番队友在外攻城拔寨,而我自己一个人在家独守空城的感觉。
好在没过多久,组长就将题目发到了群里。经过一番交流之后,我也加入到行列之中。队友的进攻相当之给力,我还没搞清楚题目状况,队友已经以迅雷不及掩耳之势扫描到端口,并搭建好了ssh隧道,很快我们就访问到了gitlab页面。但是事情没有我们想象的那么顺利,登录的用户名密码将我们拒之门外,尝试了各种不同的组合都是同样的结果。
我们猜测可能用ssh转发的方式不行,服务端可能派了重兵把守,对源ip做了限制之类的,于是转而尝试用nginx进行代理。接下来又是一波遭遇战,因为目录权限等问题自带的nginx一直起不来,以为是在编译的时候写死了,所以索性自己编译了一个扔上去。不幸的是,换成nginx代理之后访问gitlab,同样遭到了用户名密码的阻击。
我们又开始怀疑是不是对http请求头字段也做了限制,然而在做了一些尝试之后问题依然如故。正在一筹莫展之际,我们收到了官方的消息:是gitlab未设置密码。解决了gitlab登录的问题,后面的事就如顺水推舟般简单了。发起issue、创建MR、编写helloworld、编写readme、提交MR、合并MR,所有动作一气呵成。
回顾第一轮比赛,虽然只是热身赛,难度并不高,但大家也都展示出了十八般武艺,使出了各式各样的端口扫描工具和代理工具。最终大家殊途同归,54支参赛队伍中有46支都通过了比赛。然而,这仅仅只是序曲,真正的战斗才刚刚开始......
自然选择号 | 前进四!
很快地,比赛进入到了第二阶段,题目难度相比第一轮有了不少的提升,战况也明显比第一轮更加激烈。拿到题目的第一瞬间,队友已经如火如荼地开始解题了。我快速看了一下题目,从git上下载了图片,加入到解题队伍中。我方队友的攻势依旧是那么犀利,不一会儿,大二维码的信息就被扫出。拿到这道题目,我第一反应是信息会不会藏在图片最后,因为这是不影响图片正常显示的,然而dump之后并没有发现明显的文本信息。看来事情没有那么简单,于是我将焦点转向png文件的格式,看看有没有可能利用了png的格式隐藏了什么信息。在确认了所有的数据块的类型之后,没有发现什么问题,就开始尝试提取每个chunk块中的数据。正当我在编码的时候,另一条战线上的队友又传来了捷报。他非常敏锐地发现了图片中间藏着一个小二维码。于是两位队友合兵一处,开始专攻小二维码的破解工作,而我则仍然跟png处于相持状态。小二维码的防守非常顽强,队友的多轮攻势都被它防住了。不过最终还是我方技高一筹,二维码的信息最终被攻破,我方士气大振!然而只有这个信息显然不够,另外一个信息会藏在哪里呢?我又仔细分析了png的结构,试图找到其一些破绽,另外几位队友也继续开始搜寻下一个攻击目标。遗憾的是,png文件的格式毫无破绽,每个块的长度完全正确。无奈之下,只好选择将其像素值解出来,既然外部坚如磐石,不如转向内部看看有没有什么软肋。几经折腾(解压缩、解过滤)之后,终于将原始的RGB像素值解了出来,然而依然没有在其中发现明显的pattern。战局陷入了僵持状态,经过持续的长时间战斗,众将士都已相当疲乏,只好收兵作罢,来日再战。
次日,战局依旧胶着。我们尝试了用stegsolve检查各个图层是否有隐藏信息、是否通过LSB隐写将信息藏在低位bit中,我们也尝试了对图片做傅立叶变换,试图在频域找到一些信息,然而都失败了。前方陆续传来其他队伍顺利的消息,我方将士都有些士气低落,感到有点束手无策。随着时间的推移,我越来越感觉我们是不是打偏了。没有想到的是,一个无心插柳的截图竟然成了关键的转折点。在和队友交流的过程中,我发了几个png文件格式的截图,队友发现了我的截图中文件尾部跟他的有所不同,而直到他将尾部那段数据发出来之后我才意识到原来我下载的这个不是原图,已经丢失了重要的信息。我不禁仰天长啸了一声。。。
有了这个提示信息的加持,我方势如破竹,虽然还是碰到了oid和utc time的一些殊死的抵抗,没过多久,明文还是被我们顺利解出:自然选择号,前进四!。它似乎在暗示我们,要像《三体》中的自然选择号一样,全速前进,奔赴前方的星辰大海。而就在我们开始庆祝的时刻,很多队伍仍然战斗在前线。到了第三天,前方依然不断地传来他们顺利的消息,有些队伍甚至一直战斗到最后一刻。功夫不负有心人,让我们为所有的参赛队伍喝彩。
鹿死谁手 | 在此一役
经过第一轮的小试牛刀,第二轮渐入佳境,相信各个小组都已经磨合非常不错了。在前两轮的比赛中,大家或多或少碰到了一些问题,或者走了一些弯路,从赛后的解析中也都学到了不少东西,比如原来二维码的拼接也可以用代码完成啊!
第三轮比赛是什么路数,我们不得而知。不过能肯定的是,这轮比赛肯定会更加精彩。期待大家都能总结经验,及时调整到最好的状态,在接下来最关键的压轴赛中大展拳脚、各放异彩。
究竟鹿死谁手,我们拭目以待!