인터루드

funjs

U.J 2022. 11. 19. 16:18

문제
main 페이지

문제를 열면 -> 입력하는 위치가 계속해서 변경되는 것을 볼 수 있음

 
<html>
    <head>
    <style>*{margin: 0;}</style>
    <script>
    var box;
    window.onload = init;
    function init() {
      box = document.getElementById("formbox");
      setInterval(moveBox,1000);
    }
    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;
    }

    function text2img(text){
        var imglist = box.getElementsByTagName('img');
        while(imglist.length > 0) {imglist[0].remove();}
        var canvas = document.createElement("canvas");
        canvas.width = 620;
        canvas.height = 80;
        var ctx = canvas.getContext('2d');
        ctx.font = "30px Arial";
        var text = text;
        ctx.fillText(text,10,50);
        var img = document.createElement("img");
        img.src = canvas.toDataURL();
        box.append(img);
    };

    function main(){
        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)];
        if (flag[_0x374fd6(0x17c)] != 0x24) {
            text2img(_0x374fd6(0x185));
            return;
        }
        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);
    }
    </script>
    </head>
    <body>
        <div id='formbox'>
            <h2>Find FLAG !</h2>
            <input type='flag' id='flag' value=''>
            <input type='button' value='submit' onclick='main()'>
        </div>
    </body>
</html>

 

id 속성 값이 formbox인 태그를 box 변수에 넣어주고, 1초마다 movBox 함수를 시작함

-> 이것을 멈추기 위해 'setInterval(moveBox, 1000);'을 삭제해줌

 

랜덤으로 선택된 값을 가로와 세로의 길이에 -64한 값을 곱해 -> 각각 box.posX와 box.posY에 넣어줌

-> 이 변수가 left와 top이 되어 위와 같이 1초마다 입력하는 위치가 계속해서 변경되는 것임

여기서, debugger가 moveBox()에 있어 분석이 안되는 걸 알 수 있음

-> debugger를 삭제해야 함

 

문자열을 이미지로 변환해주는 함수가 존재함

-> flag는 코드 상에 존재하여 조건이 충족되면 text2ing 함수를 통해 이미지가 출력됨

 

main() 부분을 살펴보면, 조건문 2개가 보임

-> 이것에 중단점을 걸어주고, main 페이지 화면으로 돌아가 입력값을 넣어주면 이 변수의 값이 어떤 값인지 알 수 있음

 

첫번째 if문 조건문은 입력한 문자열의 길이를 비교하는 'length'임

길이가 다르다면 'NOP !'를 값으로 넣어줌

-> 이 조건을 우회해주기 위해 flag[_0x374fd6(0x17c)]의 값을 36으로 변경하여 조건문이 실행이 안되도록 함

 

아까 첫번째 if문 조건문과 달리 for문에서는 중단점이 안 먹는 것을 볼 수 있음

-> 코드를 살펴보면, 입력한 값을 인덱싱한 값과 operator 값을 비교하고 있음을 알 수 있음

 

if문에 중단점을 설정한 후, main 페이지에서 "aaa"를 입력하면 if문 전까지의 코드를 실행시킴

 

콘솔 페이지에 가서 밑의 코드를 실행시키면 

result='';
for (var i = 0x0; i < 36; i++) 
result+=String.fromCharCode(operator[i % operator[_0x374fd6(0x17c)]](_0x4949[i], _0x42931[i]));

 

 

flag 값을 알아낼 수 있음

 

답: DH{cfd4a77a013ea616d3d5cc0ddf87c1ea}

'인터루드' 카테고리의 다른 글

Arrow  (0) 2022.11.21
login-1  (0) 2022.11.20
blind sql injection advanced  (0) 2022.11.19
session  (0) 2022.11.13
proxy-1  (0) 2022.11.13