[Webhacking.kr] 54번
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 함수부분을 보자
보면 재귀로 이루어져있는 것을 볼 수 있다. x.responseText값이 없을 때가 재귀에서 탈출하는 조건이고
값이 있다면 100ms, 0.1초 후 answer함수를 i+1한 걸로 호출한다.(i++)
그럼 작동방식은 어떻게 되나 살펴보자, x=run()인데 run을 통해서 무언가를 x에 저장한다.
이러고 재귀로 돌아간다. 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!!
'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글
[Webhacking.kr] 현재 오류있는 문제나 안풀리는 문제 - 2017.10.12 (0) | 2017.10.12 |
---|---|
[Webhacking.kr] 58번 (0) | 2017.10.09 |
[Webhacking.kr] 47번 Mail Header injection (0) | 2017.09.28 |
[Webhacking.kr] 39번 (0) | 2017.09.28 |
[Webhacking.kr] 38번 (0) | 2017.09.25 |