B
funjs
D1N0
조회수 105
풀이자수
web
Description

입력 폼에 데이터를 입력하여 맞으면 플래그, 틀리면 NOP !을 출력하는 HTML 페이지입니다.
main 함수를 분석하여 올바른 입력 값을 찾아보세요 !

funjs

html파일을 열어보면 일정 시간마다 입력부분의 위치가 움직이는데, 너무 거슬려서 moveBox함수를 아무 기능도 하지 않는 함수로 바꿔놓고 시작했다

main 함수 부분이 가독성이 떨어져서 코드 흐름에 지장이 없는 변수명과 함수명을 임의로 변경해주었다

function main(){
    var li=['2XStRDS','1388249ruyIdZ','length','23461saqTxt','9966Ahatiq','1824773xMtSgK','1918853csBQfH','175TzWLTY','flag','getElementById','94hQzdTH','NOP\x20!','11sVVyAj','37594TRDRWW','charCodeAt','296569AQCpHt','fromCharCode','1aqTvAU'];
    var func1 = function(arg1, arg2) {
        arg1 = arg1 - 0x175;
        var rtn = li[arg1];
        return rtn;
    };
    (function(arg1, arg2) {
        while (true) {
            try {
                var a = -parseInt(func1(0x17f)) + parseInt(func1(0x180)) * -parseInt(func1(0x179)) + -parseInt(func1(0x181)) * -parseInt(func1(0x17e)) + -parseInt(func1(0x17b)) + -parseInt(func1(0x177)) * -parseInt(func1(0x17a)) + -parseInt(func1(0x17d)) * -parseInt(func1(0x186)) + -parseInt(func1(0x175)) * -parseInt(func1(0x184));
                if (a === arg2) break;
                else arg1['push'](arg1['shift']());
            } catch (_0x114389) {
                arg1['push'](arg1['shift']());
            }
        }
    }(li, 0xf3764));
    var flag = document[func1(0x183)](func1(0x182))['value'],
        list1 = [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],
        list2 = [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 = [(a, b) => {
            return a + b;
        }, (a, b) => {
            return a - b;
        }, (a, b) => {
            return a * b;
        }, (a, b) => {
            return a ^ b;
        }],
        getchar = String[func1(0x178)];
    if (flag[func1(0x17c)] != 0x24) {
        text2img(func1(0x185));
        return;
    }
    for (var i = 0x0; i < flag[func1(0x17c)]; i++) {
        if (flag[func1(0x176)](i) == operator[i % operator[func1(0x17c)]](list1[i], list2[i])) {} else {
            text2img(func1(0x185));
            return;
        }
    }
    text2img(flag);
}

text2img(func1(0x185));가 NOP을 보여주는 부분이고, 이는 flag의 길이가 36자가 아닐 때와 반복문에서 else 분기문에서 실행된다

for문에서 flag[func1(0x176)](i) == operator[i % operator[func1(0x17c)]](list1[i], list2[i])를 모두 만족해야 한다

list1[i]list2[i]을 4번마다 번갈아 더하고, 빼고, 곱하고, xor연산을 한 값과 flag[func1(0x176)](i)와 비교하니까, 그 연산 값을 구하면 flag를 알 수 있다

list1 = [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]
list2 = [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]
for i in range(36):
	if i%4 == 0:
    	print(chr(list1[i]+list2[i]), end='')
	if i%4 == 1:
    	print(chr(list1[i]-list2[i]), end='')
	if i%4 == 2:
    	print(chr(list1[i]*list2[i]), end='')
	if i%4 == 3:
    	print(chr(list1[i]^list2[i]), end='')

파이썬으로 간단히 구할 수 있다