개발 블로그

Suninatas(써니나타스) challenge 5 / Web 본문

해킹 및 보안/Suninatas

Suninatas(써니나타스) challenge 5 / Web

갹둥 2022. 8. 22. 15:57

아무 값이나 쓰고 Check 버튼을 눌러봤지만 아무 일도 일어나지 않는다. 개발자 도구로 코드를 보았더니 script 부분이 아래와 같이 복잡했다. 난독화가 되어있는 것 같다. 

 

*자바스크립트는 클라이언트 측에서 실행되는 언어이기 때문에 클라이언트가 해당 스크립트를 볼 수 있다. 이를 방지하기 위해 난독화를 실행한다. 난독화 방법은 다양함

<script>
	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,{}))		
</script>

packing이 되어있으므로 unpacking 해주는 사이트를 통해 난독화된 코드를 원래 코드로 바꿔줄 수 있다. 

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)
}

PASS라는 함수가 정의되어 있다. 

또 코드에 나와있는 힌트는 <!--Hint : 12342046413275659 --> 였다. 이 값을 PASS 함수의 인자로 넘겨주면 될 것 같아서 콘솔창에 입력해보았더니

result 값이 9c43c20c라는 값으로 나왔다. 이것을 입력하고 Check 버튼을 눌렀더니 Authkey가 떴다.