소스보기를 하시면 <script>로 아래와 같은 함수를 보실 수 있습니다.


보기 편하게 구분을 해놨으며 문자열이 길어 '+'로 개행 시켜놨습니다.


이거만 떡하니 있고 hint로는 <!--Hint : 12342046413275659 --> 로 되어있습니다.


다른 내용이 없으니 해당 함수가 어떻게 동작하는지 알아야할 것 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
eval
(
    function(p,a,c,k,e,r)
    {
        e=function(c){return c.toString(a)};
        if(!''.replace(/^/,String))
        {
            while(c--)r[e(c)]=k[c]||e(c);
            k=[function(e){return r[e]}];
            e=function(){return'\\w+'};
            c=1
        };
        while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);
        return p
    }
    ('g l=m o(\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'a\',\'b\',\'c\',\'d\',\'e\',\'f\');'
+'p q(n){g h=\'\';g j=r;s(g i=t;i>0;){i-=4;g k=(n>>i)&u;v(!j||k!=0){j=w;h+=l[k]}}x(h==\'\'?\'0\':h)}'
    ,34
    ,34
    ,'||||||||||||||||var|result||start|digit|digitArray|new||Array|function|PASS|true|for|32|0xf|if|false|return'.split('|')
    ,0
    ,{})
)
                        
cs



우선 eval() 함수는 javascript의 코드를 계산하여 결과를 도출해주는 역할을 합니다.

이 상태로 console에 붙여넣으면 제대로 실행이 안되는걸 보니 하나하나 차례대로 알아봐야할 것 같습니다.


우선 크게 function(p,a,c,k,e,r)로 되어있습니다. packer.. 로 되어있는걸 보니 어떤 문자열이 이 함수를 통해서 packing 된게 아닌가 하는 생각을 해봅니다.


또한 ( )로 인자가 6개있는데 function{}뒤에 바로 붙여서 나와있습니다.

그럼 차례대로 p,a,c,k,e,r 이라고 생각하시면 됩니다.



그럼 이제 맨 위에부터 차례대로 수행하면 됩니다.

위에 생각한대로 보시면 a=34, c=34, e=0 이라고 생각할 수 있습니다.



1
e=function(c){return c.toString(a)};
cs


toString() 함수는 문자열을 반환해주는 함수입니다.


console을 이용해서 어떤 값이 반환 되는지 확인해봅니다.

다음과 같이 "10"을 반환하게 됩니다.


다음을 보시면  !''.replace(/^/,String)  복잡해 보이지만 이 값은 true입니다.

if(true)이므로 항상 실행하게 됩니다. (의미 없음)


1
2
3
4
5
6
if(!''.replace(/^/,String)){
    while(c--)r[e(c)]=k[c]||e(c);
    k=[function(e){return r[e]}];
    e=function(){return'\\w+'};
    c=1
};

cs


while문은 c값이 현재 34이므로 한번 실행할때마다 -1 되고 -1이 될때까지 진행하게 됩니다.


진행하면 r 값에는 아래와 같이 들어가게 됩니다.


 

  1. 0:"0"
  2. 1:"1"
  3. 2:"2"
  4. 3:"3"
  5. 4:"4"
  6. 5:"5"
  7. 6:"6"
  8. 7:"7"
  9. 8:"8"
  10. 9:"9"
  11. a:"a"
  12. b:"b"
  13. c:"c"
  14. d:"d"
  15. e:"e"
  16. f:"f"
  17. g:"var"
  18. h:"result"
  19. i:"i"
  20. j:"start"
  21. k:"digit"
  22. l:"digitArray"
  23. m:"new"
  24. n:"n"
  25. o:"Array"
  26. p:"function"
  27. q:"PASS"
  28. r:"true"
  29. s:"for"
  30. t:"32"
  31. u:"0xf"
  32. v:"if"


이후 k와 e의 함수를 정의하고 c값을 1로 설정합니다.


1
while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);
cs


"new RegExp" 는 정규표현식을 나타냅니다.

생성자 함수를 사용하면 정규식이 실행 시점에 컴파일 됩니다.

e(c) 값이 주기적으로 변경되므로 생성자 함수를 사용하여 표현 하였습니다.


new RegExp('\\b\w+\\b' , 'g') 와 같이 표현됩니다.


  \b : 단어의 경계를 나타냄

  \w : 밑줄 문자를 포함한 영숫자 문자에 대응. [A-Za-z0-9_] 와 동일

  + : 앞 표현식이 1회 이상 연속으로 반복되는 부분


  'g' : flags 값으로 모든 pattern에 대한 전역 검색

 



다음 함수를 수행하면 아래와 같이 p값이 나옵니다. (문단 구분함)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
var digitArray = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
function PASS(n){
    var result = '';
    var start  = true;
    for(var i=32; i>0 ;){
        i- = 4;
        var digit = (n>>i)&0xf;
        if(!start||digit != 0){
            start   = false;
            result += digitArray[digit]
        }
    }
    return (result==''?'0':result)
}
cs



함수명부터 PASS인걸 보니 이 함수를 통해 키값을 찾는거 같습니다.


처음에 힌트로 <!--Hint : 12342046413275659 --> 숫자를 주었습니다. 이 값을 넣어보면 값이 나오게 됩니다.


해당 값으로 Check 해보면 다음과 같이 문제 인증키를 얻을 수 있습니다.



[참고]

정규표현식: https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D

'WarGame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS_29 [FORENSIC]  (0) 2018.09.15
SuNiNaTaS_16 [SYSTEM]  (0) 2018.09.14
SuNiNaTaS_31 [FORENSIC]  (0) 2018.09.13
SuNiNaTaS_17 [MISC]  (0) 2018.09.12
SuNiNaTaS_28 [FORENSIC]  (0) 2018.09.12

+ Recent posts