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

2014-03-10 11:48:31 57 7234 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次

要评论?请先  登录  或  注册
  • 37楼
    2014-3-11 10:27

    真心涨姿势了

  • 36楼
    2014-3-11 10:03

    卡到游xi那块儿过不去了,js也没仔细看

  • 35楼
    2014-3-11 09:47

    叼啊。。。。。。

  • 34楼
    2014-3-11 09:34
    PSoul

    请问楼主一般是拿什么改JS比较方便呢?有没一款软件可以禁止页面的某个JS文件或者修改调用之类的。

    1
    faust

    chrome然后F12,选中你要改的js修改好后ctrl+s保存就好了

    2
    PSoul

    IE下呢?我现在有个环境应该是必须IE才可以。有什么办法吗?因为我那个环境需要装个activeX插件,我想谷歌浏览器应该装不了吧。

    3

    IE下有开发人员工具箱。一样有快捷键。debug这些个工具很多的。

  • 33楼
    2014-3-11 09:31
    PSoul

    其实我觉得adnin admin这个真是太亮了。。。其他牛逼的绕过都被这个亮光掩盖下去了。。原来是admin啊。。搞得我那么兴奋。。

    1
    faust

    囧。。。我没注意看我的原文。是笔误,是admin admin

    2
    PSoul

    原来只是admin,我就说楼主怎么会想到adnin。

    3

    原来是笔误呀,我以为真像阁下所说不是弱口令。看来歪打正着,我又学了一招。

  • 32楼
    2014-3-11 09:19

    哈哈哈,admin admin 亮瞎…… 等会儿去试试这BCTF

  • 31楼
    2014-3-11 08:59
    PSoul

    其实我觉得adnin admin这个真是太亮了。。。其他牛逼的绕过都被这个亮光掩盖下去了。。原来是admin啊。。搞得我那么兴奋。。

    1
    faust

    囧。。。我没注意看我的原文。是笔误,是admin admin

    2

    原来只是admin,我就说楼主怎么会想到adnin。

  • 30楼
    2014-3-11 08:52

    涨姿势了,不错的帖子

  • 29楼
    2014-3-11 00:10

    真逗, admin 那点 就不是人家考验的目的,

  • 28楼
    2014-3-10 22:57
    PSoul

    其实我觉得adnin admin这个真是太亮了。。。其他牛逼的绕过都被这个亮光掩盖下去了。。原来是admin啊。。搞得我那么兴奋。。

    1

    囧。。。我没注意看我的原文。是笔误,是admin admin

  • 27楼
    2014-3-10 22:56
    icc

    楼主应该是笔误,应该是admin admin。 如果真是adnin,谁能猜到?

    1

    囧。。。确实是笔误,已经改好了。。

  • 26楼
    2014-3-10 22:53

    表示是试Alice。。。Alice508。。。都没事出来,然后就放弃了,现在想来真心悔恨啊。。。

  • 25楼
    2014-3-10 22:02

    楼主应该是笔误,应该是admin admin。 如果真是adnin,谁能猜到?

  • 24楼
    2014-3-10 20:27

    好吧 我也是从别人哪里看到的

  • 23楼
    2014-3-10 19:45
    PSoul

    请问楼主一般是拿什么改JS比较方便呢?有没一款软件可以禁止页面的某个JS文件或者修改调用之类的。

    1
    hn6ssg

    我到xi望你说下其中奥妙,我想仔细体会!图文并茂的更好,方便我学xi!谢谢

    2

    你想啊,谁会尝试adnin这个用户?至少我是不会。。我的弱口令字典里都没这一条呢。

  • 22楼
    2014-3-10 18:58
    PSoul

    请问楼主一般是拿什么改JS比较方便呢?有没一款软件可以禁止页面的某个JS文件或者修改调用之类的。

    1
    faust

    chrome然后F12,选中你要改的js修改好后ctrl+s保存就好了

    2
    PSoul

    IE下呢?我现在有个环境应该是必须IE才可以。有什么办法吗?因为我那个环境需要装个activeX插件,我想谷歌浏览器应该装不了吧。

    3

    ie下的不清楚呢,我已经摒弃ie了。。。

  • 21楼
    2014-3-10 18:55
    TellYouThat

    1、表示改属性得到的key是对的?2、deadghost 是死去的僵尸。。。 必须全部杀死才能得到key

    1

    我一个僵尸都没杀死,然后直接冲到终点,得到的key提交就过关了。。。deadhost是固定值,我第二段代码就是把这个改成了10的哦

  • 20楼
    2014-3-10 18:54
    anlfi

    this.key += newGhost.gh;this.key += "%"+this.player.pe;this.pe = authp(this.moveSpeed, this.life);this.key = ""this.deadghost = 0;if(this.deadghost == 10)key的计算是中和参数进行计算 杀死10个僵尸 僵尸和玩家属性(authp(this.moveSpeed, this.life);)不变 才是正确的key全部10个zombie 无属性修改也能通关 为了轻松this.shootDuration=10;啪啪啪的过 嘿嘿html5游xi真好玩呢 改js就能作弊

    1

    HTML5的页游是以后的趋势啊~

  • 19楼
    2014-3-10 18:42

    多谢提供思路啊,太 难辨了

  • 18楼
    2014-3-10 18:41