[Webhacking.kr] 54번

2017. 9. 28. 23:55

Password is


문제에 들어가면 위의 문장이 하나 떠있다. 조금 기다리면

Password is 뒤에 한글자씩 문자가 나온다. 아마 Password를 한글자씩 알려주는 것 같다...


일단 소스를 보자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<html>
<head>
<title>Challenge 54</title>
</head>
<body>
<h1><b>Password is <font id=aview></font></b></h1>
<script>
function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
 
  }else{
   return null;
  }
 }
 
x=run();
 
function answer(i)
{
x.open('GET','?m='+i,false);
x.send(null);
aview.innerHTML=x.responseText;
i++;
if(x.responseText) setTimeout("answer("+i+")",100);
if(x.responseText=="") aview.innerHTML="?";
}
 
setTimeout("answer(0)",10000);
 
</script>
</body>
</html>
 
cs


뭐가 엄청 복잡하다. 일단 answer이라는 함수가 중요해보인다.


이 함수는 setTimeout함수를 통해 실행된다. 자바스크립트에서 setTimeout함수는 어떤것인지 먼저 보겠다.


setTimeout([Function], [Milliseconds])

 

 - 특정 시간 이 후, 단 한번만 특정 함수 또는 코드를 실행시킬 때 사용합니다.

 - 2번째 인자의 시간(Milliseconds)이 경과하면 1번째 인자의 함수를 실행합니다.


그러므로 setTimeout("answer(0)",10000); 이 부분은 10000ms , 10초 후에 answer함수에 인자 0을 넣어 실행하라! 라는 의미이다.


실제로 문제페이지에서 10초를 기다리면 그 때부터 문자가 하나씩 나오기 시작한다.


뭐 저걸 하나하나 일일이 적어서 봐도 되긴하지만 그러기엔 너무 귀찮으므로... 크롬 개발자도구를 이용해서 위의 자바스크립트부분을 조금 수정하면


하나씩 뜨던걸 바꿀수 있지 않을까 싶다.


계속해서 answer 함수부분을 보자


function answer(i)
{
x.open('GET','?m='+i,false);
x.send(null);
aview.innerHTML=x.responseText;
i++;
if(x.responseText) setTimeout("answer("+i+")",100);
if(x.responseText=="") aview.innerHTML="?";
}


보면 재귀로 이루어져있는 것을 볼 수 있다. x.responseText값이 없을 때가 재귀에서 탈출하는 조건이고


값이 있다면 100ms, 0.1초 후 answer함수를 i+1한 걸로 호출한다.(i++)


그럼 작동방식은 어떻게 되나 살펴보자, x=run()인데 run을 통해서 무언가를 x에 저장한다.

x.open('GET','?m='+i,false); // x에서 GET방식으로 m에 i를 해서 페이지를 연다.
x.send(null);                   // 첫줄에서 GET방식으로 연것을 보낸다.
aview.innerHTML=x.responseText; // html페이지로 x.responseText값을 노출시킨다.
i++;


이러고 재귀로 돌아간다. aview.innerHTML의 값이 0.1초마다 계속 다른 값으로 대입되므로 바뀌게 되는 것이다.


그러므로 이 부분을 aview.innerHTML+=x.responseText; 로 바꾸면 값이 대입되어 바뀌는게 아니고 계속 추가되는 것이므로 

계속 출력될 것을 알 수 있다. 또 if(x.responseText=="") aview.innerHTML="?"; 이 부분은 x.responseText 값이 없으면 ?로 바꾸는 부분이므로

지워버리는게 좋을 것같다.


이제 크롬 개발자도구로 수정해보자.


수정된 소스는 아래와 같다.


...는 안되서 그냥 밑과 같은 것을 개발자도구에서 Console에 입력했다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
 
  }else{
   return null;
  }
 }
 
x=run();
 
function answer(i)
{
x.open('GET','?m='+i,false);
x.send(null);
aview.innerHTML+=x.responseText;
i++;
if(x.responseText) setTimeout("answer("+i+")",100);
}
answer(0);
 
 
cs



밑과 같은게 출력됬다. 중간을 *로 하겠다.

a64**************************f8e

정답을 Auth에 입력하면 클리어된다.


challenge 54 clear!!

+ Recent posts