본문 바로가기
웹/드림핵

funjs

by SH_L 2022. 5. 14.
반응형

[문제]

 

 

[풀이]

 

 

문제에 접속하면 "Find FLAG !"가 써있는 입력창이 계속 움직이는 것을 확인할 수 있다.

 

function moveBox() {
        box.posX = Math.random() * (window.innerWidth - 64); 
        box.posY = Math.random() * (document.documentElement.scrollHeight - 64); 
        box.style.marginLeft = box.posX + "px";
        box.style.marginTop  = box.posY + "px";
        debugger;
    }

 

입력창의 이동과 debugger의 감지를 moveBox() 함수가 담당하고 있기에 해당 부분을 삭제하고 저장해 주었다. moveBox() 함수를 삭제하니 더 이상 입력창이 움직이지 않고 왼쪽 상단에 고정된 상태로 존재한다.

 

 

입력창에 임의로 'flag'를 입력하니 다음과 같이 'NOP !'이 출력된다.

 

for (var i = 0x0; i < flag[_0x374fd6(0x17c)]; i++) {
	if (flag[_0x374fd6(0x176)](i) == operator[i % operator[_0x374fd6(0x17c)]](_0x4949[i], _0x42931[i])) {} else {
		text2img(_0x374fd6(0x185));
		return;
	}
}

text2img(flag);

 

해당 소소 코드를 살펴보면 'flag[_0x374fd6(0x176)'와 'operator[i % operator[_0x374fd6(0x17c)]](_0x4949[i], _0x42931[i]))'의 값이 서로 일치할 때 text2img(flag)를 출력하고, 값이 서로 일치하지 않을 때 text2img(_0x374fd6(0x185))를 출력하는 것으로 보인다.

 

text2img(_0x374fd6(0x185))는 위에서 'test'를 입력했을 때 출력되었던 'NOP !'이고, text2img(flag)는 올바른 입력 값을 입력했을 때 출력되는 플래그로 예상된다.

 

var _0x1046=['2XStRDS','1388249ruyIdZ','length','23461saqTxt','9966Ahatiq','1824773xMtSgK','1918853csBQfH','175TzWLTY','flag','getElementById','94hQzdTH','NOP\x20!','11sVVyAj','37594TRDRWW','charCodeAt','296569AQCpHt','fromCharCode','1aqTvAU'];
var _0x376c = function(_0xed94a5, _0xba8f0f) {
	_0xed94a5 = _0xed94a5 - 0x175;
	var _0x1046bc = _0x1046[_0xed94a5];
	return _0x1046bc;
};

var _0x374fd6 = _0x376c;
(function(_0x24638d, _0x413a92) {
	var _0x138062 = _0x376c;
	while (!![]) {
		try {
			var _0x41a76b = -parseInt(_0x138062(0x17f)) + parseInt(_0x138062(0x180)) * -parseInt(_0x138062(0x179)) + -parseInt(_0x138062(0x181)) * -parseInt(_0x138062(0x17e)) + -parseInt(_0x138062(0x17b)) + -parseInt(_0x138062(0x177)) * -parseInt(_0x138062(0x17a)) + -parseInt(_0x138062(0x17d)) * -parseInt(_0x138062(0x186)) + -parseInt(_0x138062(0x175)) * -parseInt(_0x138062(0x184));
			if (_0x41a76b === _0x413a92) break;
			else _0x24638d['push'](_0x24638d['shift']());
		} catch (_0x114389) {
			_0x24638d['push'](_0x24638d['shift']());
		}
	}
}(_0x1046, 0xf3764));

var flag = document[_0x374fd6(0x183)](_0x374fd6(0x182))['value'],
	_0x4949 = [0x20, 0x5e, 0x7b, 0xd2, 0x59, 0xb1, 0x34, 0x72, 0x1b, 0x69, 0x61, 0x3c, 0x11, 0x35, 0x65, 0x80, 0x9, 0x9d, 0x9, 0x3d, 0x22, 0x7b, 0x1, 0x9d, 0x59, 0xaa, 0x2, 0x6a, 0x53, 0xa7, 0xb, 0xcd, 0x25, 0xdf, 0x1, 0x9c],
	_0x42931 = [0x24, 0x16, 0x1, 0xb1, 0xd, 0x4d, 0x1, 0x13, 0x1c, 0x32, 0x1, 0xc, 0x20, 0x2, 0x1, 0xe1, 0x2d, 0x6c, 0x6, 0x59, 0x11, 0x17, 0x35, 0xfe, 0xa, 0x7a, 0x32, 0xe, 0x13, 0x6f, 0x5, 0xae, 0xc, 0x7a, 0x61, 0xe1],
	operator = [(_0x3a6862, _0x4b2b8f) => {
		return _0x3a6862 + _0x4b2b8f;
	}, (_0xa50264, _0x1fa25c) => {
		return _0xa50264 - _0x1fa25c;
	}, (_0x3d7732, _0x48e1e0) => {
		return _0x3d7732 * _0x48e1e0;
	}, (_0x32aa3b, _0x53e3ec) => {
		return _0x32aa3b ^ _0x53e3ec;
	}],
    getchar = String[_0x374fd6(0x178)];

 

먼저 개발자 도구의 Console 탭에서 main() 함수에 있는 값들을 load해주었다.

 

 

mian() 함수에 있는 값들을 load 한 다음에 Concsole 탭에서 text2img(_0x374fd6(0x185))가 위에서 출력된 'NOP !'이 맞는지 확인해보았다. 확인 결과 'NOP !'이 맞았다.

 

if (flag[_0x374fd6(0x17c)] != 0x24) {
	text2img(_0x374fd6(0x185));
	return;
}

 

 

if 문을 살펴보면 flag[_0x374fd6(0x17c)]의 값이 0x24가 아닐 때, 'NOP !'을 출력한다. 이때, _0x374fd6(0x17c)이 무엇을 의미하는지 알아보자.

 

 

_0x374fd6(0x17c)는 length라는 의미로 즉, 플래그의 길이가 0x24라는 것을 알 수 있다.

 

 

0x24는 36을 의미한다.

 

위에서 얻은 결과를 정리하자면 플래그를 얻기 위해서는 아래의 두 가지 조건을 만족하면 된다.

1. 'flag[_0x374fd6(0x176)'와 'operator[i % operator[_0x374fd6(0x17c)]](_0x4949[i], _0x42931[i]))'의 값이 서로 일치한다.

2. 전체 플래그의 길이는 36이다.

 

 

따라서 두 가지 조건을 모두 만족하기 위해 다음과 같이 코드를 작성했다. 코드를 실행하면 플래그를 확인할 수 있다.

반응형

' > 드림핵' 카테고리의 다른 글

Cookie  (0) 2022.08.20
devtools-sources  (0) 2022.08.20
login-1  (0) 2022.05.14
session  (0) 2022.05.14
web-misconf-1  (0) 2022.05.10