学破解第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;
}
```
  2.百度一下!!啥意思,!!判断是否为空,后面?:和学C语言时的三目运算符一样,我们发现ic必须为true(非空),才能输出flag,接下来回到前面去找哪里决定了ic的值。
```
ic = checkToken(token);
```
去看看checkToken函数
```
function checkToken(s) {
return s === "FAKE-TOKEN";
}
```
尝试输入FAKE-TOKEN,点击按钮,发现还是不对
  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,那么问题的关键就在于这个函数了。
  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)
  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:善于总结,善于发现,找到分析问题的思路和解决问题的办法。虽然我现在还是零基础的小菜鸟一枚,也许学习逆向逆天改命我会失败,但也有着成功的可能,只要还有希望,就决不放弃!** 论坛处处是高手,学习永远无止境!感谢分享过程。 支持一下楼主 楼主加油 像小菜同志学习,加油兄弟 可以呀.兄弟 楼主加油 厉害~ 学无止境 佩服楼主,考双手吃饭,打工不丢人 论坛处处是高手,学习永远无止境!感谢分享过程。 加油,兄弟。只要肯下力气和功夫,一定能成功的