소스보기를 하시면 <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 }; |
while문은 c값이 현재 34이므로 한번 실행할때마다 -1 되고 -1이 될때까지 진행하게 됩니다.
진행하면 r 값에는 아래와 같이 들어가게 됩니다.
|
이후 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 |