几道简单的CTF题目思路

前言

公司内部举行的小比赛,之前从未参与过此类比赛,所以各位看官大佬多多指教。简单来说就是给出题目从中找出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>

ycyin大约 10 分钟算法&数学CTFPythonJava