学破解第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文件,如下图所示:
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 = [118, 104, 102, 120, 117, 108, 119, 124, 48,123,101,120];
if (s.length == a.length) {
for (i = 0; i < s.length; i++) {
if (a[i] - s.charCodeAt(i) != 3)
return ic = false;
}
return ic = true;
}
return ic = false;
}
而s就是我们输入的token,那么问题的关键就在于这个函数了。
4.看不看得懂不要紧,以彼之矛攻彼之盾嘛,百度与charCodeAt相反的函数是fromCharCode,直接把它的代码改成:
var a = [118, 104, 102, 120, 117, 108, 119, 124, 48,123,101,120];
for (i = 0; i < a.length; i++) {
var s = a[i] - 3;
console.log(String.fromCharCode(s));
}
复制粘贴丢进控制台执行一下,结果如图所示:
5.得到token:security-xbu,输入token,得到flag。
0x5总结
1.以结果为导向,反向追踪,层层回溯,定位关键点
2.遇到不认识的代码和函数,利用百度搜索,明白函数的作用和使用方法
3.利用数学思维a - b = 3,可以等价转换成 b = a - 3
0x6参考资料
1.js中!和!!的区别及用法
2.JavaScript fromCharCode() 方法
PS:善于总结,善于发现,找到分析问题的思路和解决问题的办法。虽然我现在还是零基础的小菜鸟一枚,也许学习逆向逆天改命我会失败,但也有着成功的可能,只要还有希望,就决不放弃!