前言
公司内部举行的小比赛,之前从未参与过此类比赛,所以各位看官大佬多多指教。简单来说就是给出题目从中找出flag就成功了,flag格式为flag{32位md5加密字符串}
。感觉其中几道有点意思,记录一下!
hard-js
关于JS的一道题,主要是要分析js代码。从源码中可以看出flag的32位md5串每一位都可以推算出来:
<script>
var check = document.getElementById('check')
check.onclick = function() {
var t = document.getElementById('flag').value;
checkFlag(t) ? alert("Congratulations!!! Your flag is " + t) : alert("You need good good study~~")
}
function checkFlag(f) {
l = []
for (let i of f) {
l.push(i.charCodeAt())
}
return (
f.length === 38
&& l[10] === 51
&& sub(l[6], l[5]) === 1
&& f.substring(37, 38) === '}'
&& l[6] === l[7]
&& mul(l[10], 2) === l[12]
&& sub(l[9], l[8]) === 1
&& l[7] === l[8]
&& f.substring(0, 5) === 'flag{'
&& div(l[9], 2) === sub(l[10], 1)
&& add(l[10], l[11]) === add(l[12], 6)
&& btoa(f.substring(13, 21)) === "MDMzOGIwNmE="
&& e_l(l.slice(21,29).reverse(), [48, 101, 52, 56, 56, 102, 102, 53])
&& c(l.slice(29,37))
)
}
function add(a, b) {
return a+b
}
function sub(a, b) {
return a-b
}
function mul(a, b) {
return a*b
}
function div(a, b) {
return Math.floor(a/b)
}
function xor(a, b) {
return a^b
}
function e_l(a, b) {
a.forEach((i,j)=>{
if (i !== b[j]) {
return false
}
})
return true
}
function c(a){
return
a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]==604 &&
a[0]-a[1]-a[2]-a[3]-a[4]-a[5]-a[6]-a[7]==-406 &&
a[1]+a[3]+a[5]+a[7]-a[6]-a[2]-a[0]-a[4]==6 &&
a[0]+a[1]-a[2]-a[3]==-3 &&
a[0]-a[1]+a[2]+a[3]==201 &&
a[4]-a[5]+a[6]+a[7]==109 &&
a[4]+a[5]-a[6]-a[7]==-1 &&
a[1]+a[3]-a[5]*a[7]==-5394 &&
a[0]+a[2]-a[4]*a[6]==-5145
}
</script>
2021年8月23日大约 10 分钟