小菜鸟一枚 发表于 2021-8-11 23:11

学破解第138天,《攻防世界crypto练习区flag\_in\_your\_hand1》学习

## 学破解第138天,《攻防世界crypto练习区flag\_in\_your\_hand1》学习
前言:
  从小学到大专(计算机网络技术专业),玩过去的,所以学习成绩惨不忍睹,什么证书也没考,直到找不到工作才后悔,不知道怎么办才好。

  2017年12月16日,通过19元注册码注册论坛账号,开始做伸手党,潜水一年多,上来就是找软件。(拿论坛高大上的软件出去装X)

  2018年8月10日,报名了华中科技大学网络教育本科(计算机科学与技术专业)2018级秋季。(开始提升学历)

  2019年6月17日,不愿再做小菜鸟一枚,开始零基础学习破解。(感谢小糊涂虫大哥在我刚开始学习脱壳时,录制视频解答我的问题)

  2020年7月7日,感谢H大对我的鼓励,拥有了第一篇获得优秀的文章。(接下来希望学习逆向,逆天改命)

  2021年8月11日,华科学位英语2次不过,仅取得了毕业证书,学业提升失败,开始琢磨考注册类和职称类证书,谋求涨薪

  坛友们,年轻就是资本,和我一起逆天改命吧,我的学习过程全部记录及学习资源:(https://www.52pojie.cn/thread-1278021-1-1.html)
立帖为证!--------记录学习的点点滴滴

### 0x1下载文件
  1.下载CM,是一个压缩包,解压后发现由1个html和1个js文件构成。

  2.浏览器中打开html文件,如下图所示:
!(https://z3.ax1x.com/2021/08/11/faOtit.png)

  3.发现就是输入token,点击get flag按钮得到flag。

### 0x2跟踪分析
  1.既然是前端代码,我们就用记事本打开看看源码,找到get flag按钮触发的函数
```
<input type="button" value="Get flag!" onclick="getFlag()" />
```
找到getflag()函数
```
function getFlag() {
        var token = document.getElementById("secToken").value;
        ic = checkToken(token);
        fg = bm(token);
        showFlag()
}
```
前面两个我们先不管,看showFlag()函数
```
function showFlag() {
        var t = document.getElementById("flagTitle");
        var f = document.getElementById("flag");
        t.innerText = !!ic ? "You got the flag below!!" : "Wrong!";
        t.className = !!ic ? "rightflag" : "wrongflag";
        f.innerText = fg;
}
```

&emsp;&emsp;2.百度一下!!啥意思,!!判断是否为空,后面?:和学C语言时的三目运算符一样,我们发现ic必须为true(非空),才能输出flag,接下来回到前面去找哪里决定了ic的值。
```
ic = checkToken(token);
```
去看看checkToken函数
```
function checkToken(s) {
    return s === "FAKE-TOKEN";
}
```
尝试输入FAKE-TOKEN,点击按钮,发现还是不对

&emsp;&emsp;3.接下来怎么办呢?显然ic的值在调用showFlag函数之前肯定被设置为FALSE了,在js文件中搜索ic这个变量,找到赋值为FALSE的地方,类似OD中的关键跳。
```
function ck(s) {
    try {
      ic
    } catch (e) {
      return;
    }
    var a = ;
    if (s.length == a.length) {
      for (i = 0; i < s.length; i++) {
            if (a - s.charCodeAt(i) != 3)
                return ic = false;
      }
      return ic = true;
    }
    return ic = false;
}
```
而s就是我们输入的token,那么问题的关键就在于这个函数了。

&emsp;&emsp;4.看不看得懂不要紧,以彼之矛攻彼之盾嘛,百度与charCodeAt相反的函数是fromCharCode,直接把它的代码改成:
```
        var a = ;
    for (i = 0; i < a.length; i++) {
         var s = a - 3;
               console.log(String.fromCharCode(s));
    }
```
复制粘贴丢进控制台执行一下,结果如图所示:
!(https://z3.ax1x.com/2021/08/11/fdpzg1.png)

&emsp;&emsp;5.得到token:security-xbu,输入token,得到flag。
!(https://z3.ax1x.com/2021/08/11/fd90VU.png)

### 0x5总结
  1.以结果为导向,反向追踪,层层回溯,定位关键点
  2.遇到不认识的代码和函数,利用百度搜索,明白函数的作用和使用方法
  3.利用数学思维a - b = 3,可以等价转换成 b = a - 3

### 0x6参考资料
1.(https://blog.csdn.net/chenggang_zh/article/details/84335252)
2.(https://www.runoob.com/jsref/jsref-fromcharcode.html)

  **PS:善于总结,善于发现,找到分析问题的思路和解决问题的办法。虽然我现在还是零基础的小菜鸟一枚,也许学习逆向逆天改命我会失败,但也有着成功的可能,只要还有希望,就决不放弃!**

maoweikang 发表于 2021-8-12 09:49

论坛处处是高手,学习永远无止境!感谢分享过程。

RainGoal 发表于 2021-8-11 23:25

支持一下楼主

ww12 发表于 2021-8-11 23:31

楼主加油

Sky℃ 发表于 2021-8-12 00:00

像小菜同志学习,加油兄弟

蓝纹鲸 发表于 2021-8-12 00:26

可以呀.兄弟

nug 发表于 2021-8-12 00:26

楼主加油 厉害~

lmyx2008 发表于 2021-8-12 06:19

学无止境

SuperGround 发表于 2021-8-12 07:14

佩服楼主,考双手吃饭,打工不丢人

CCQc 发表于 2021-8-12 07:20

论坛处处是高手,学习永远无止境!感谢分享过程。

xqsquare 发表于 2021-8-12 07:51

加油,兄弟。只要肯下力气和功夫,一定能成功的
页: [1] 2 3 4
查看完整版本: 学破解第138天,《攻防世界crypto练习区flag\_in\_your\_hand1》学习