BCTF 选拔赛一道蛋疼的题目:真假难辨

2014-03-10 11:48:31 57 7210 2


BCTF里web板块有一道很有趣的题目,当时在做题的时候绕了点弯子,直到做出来的一刻才倍感蛋疼。这里就把流程记录一下,供各位看官一笑。
  题目的描述是“唯有游戏与美食不可辜负。米特尼克拿到Alice的资料之后接着在BAT内网游荡,他发现了一个被限制的游戏,只有管理员Alice自己才能玩,但区区一个管理员的限制怎么能挡住米特尼克爱游戏的心!”然后给出了个链接,点进去发现就一个按钮,提示“此游戏只能在本机运行!”点击按钮后弹出提示“You must login at host computer ”。要绕过这一步很简单,打开burpsuite,刷新下页面后查看拦截的内容,发现有个ip的字段,修改为127.0.0.1 后提交,此时错误提示不见了,取而代之的是一个基础认证登录框。试了几次发现admin admin(先前是笔误,现在改好了)可以顺利登录进去(别问我怎么做到的,我猜的!真的!)
  登录进去后跳转到了一个画风极其拙劣的游戏界面,如图
   

  一个绿衣服绿帽子的小人捧着枪打僵尸的剧情。这种游戏对于我这样一个骨灰级职业玩家根本就是小菜一碟有没有!于是在我发现了主角只有五点血、小怪根本打不死、后期小怪各种打鸡血加速移动的逆天bug之下,我放弃了-。-  甚至一度怀疑这个游戏就是个坑爹的存在!因为题目名字本身就是“真假难辨”然后我开始找别的入口点但都以失败告终。
  整理下思路回到这个游戏,看看源代码发现游戏本身全部都是依靠agint1.js来控制的,包括人物的血量,移动速度,小怪的血量(尼玛小怪的血量要打20枪才死啊!玩到后面四五个小怪疯了一样扑过来怎么玩!)在代码里搜一下life关键字,果然发现了受伤害掉血的函数:
  player.prototype.hurt=function(){
          var now=(new Date()).getTime();
          var floorY=this.y+this.height;
          if(now-this.lastHurtTime>=this.hurtDuration){
                  this.life--;   //关键在这里,把life--改成life++ 小怪撞到你就加血了,蛤蛤~
                 
                  if(isToLeft(this)){
                          this.setCurrentAnimation("playerHurtLeft");       
                  }
                  else if(isToRight(this)){
                          this.setCurrentAnimation("playerHurtRight");
                  }
                  this.index(0);
                  this.isHurt=true;
  
                  if(this.life<=0){
                          this.die();       
                  }
                  this.y=floorY-this.height;
                  this.lastHurtTime=now;
          }
修改好了试验一下,果然弱鸡变洛基啊!任他雄兵百万,我自金枪不倒!但是这样还是没意义啊,一路打通关后弹出个提示“once again”。那我就once again吧。结果第二把,第三把还是once again。。。。这样可不行,再看看代码。发现了下面这个关键点
if(cnGame.collision.col_Between_Rects(this.player.getRect(),this.end.getRect())){
            if(this.deadghost == 10){
                this.key = authnum(this.key, this.deadghost);
                alert("The Key is:" + this.key);
            }
            else{
                alert("once again!");
            }
            cnGame.loop.end();
            return;
        }
  
大概意思就是,通关十次后,通过这个验证函数authnum就可以得到解密的key了。但是我不会傻乎乎的玩十次的。简单的修改下,改成
  update:function(duration){
                  if(cnGame.collision.col_Between_Rects(this.player.getRect(),this.end.getRect())){
                          if(1){
                                  this.key = authnum(this.key, 10);
                                  alert("The Key is:" + this.key);
                          }
                          else{
                                  alert("once again!");
                          }
                          cnGame.loop.end();
                          return;
                  }
这样一来就可以一次过关就能得到答案了。果不其然,洛基在一大群丧尸的追捧下到达了终点,得到了答案。Game over。
  最后有的同学可能会问为什么不在chrome里的console功能直接运行authnum函数得到答案呢?因为key是和整个游戏关联的,具体的方法没有细看,但是能肯定的是要通过口算得到key的值是要花一点功夫的,还不如直接作弊打通关一轮游戏来得快。蛤蛤

关于作者

faust11篇文章984篇回复

评论57次

要评论?请先  登录  或  注册