본문 바로가기

Webhacking.kr

[Webhacking.kr] Challenge 12

요즘 좀 바빠서 글을 자주는 못 올릴것 같지만

 

최대한 열심히 올려보겠습니다.

 

Challenge 12

 

문제에 들어가니 javascript challenge라고 한다.

 

한번 소스코드를 살펴보자.

 

 

???

 

무슨 텍스트 얼굴들이 가득하다..

 

소스코드를 가져와도 의미가 없을것 같으니 일단 풀어보자..

 

처음에 어떻게 풀지 고민을 많이했다.

 

저것들을 의미없이 넣은건 아닐거고

 

특히 코드 처음 부분에 주황색이 있는걸 보아 저걸 코드로 인식하는것 같은데..

 

계속 서칭을 해보니 자바스크립트 난독화라는걸 알게되었다.(다른 언어도 가능)

 


난독화란?

 

쉽게 말해 다른사람들이 읽기 어렵게 코드를 바꾸는것을 말한다.

 

이를 하는 이유는 나의 코드를 직접적으로 숨겨 다른 사람들이 이해하지 못하게 하기 위하거나

코드의 가독성을 낮춰 역공학을 막기 위함이다(역공학 관련해서는 나중에 알아보자).

 

난독화는 적용하는 대상에 따라 소스 코드 난독화와 바이너리 난독화로 나눌 수 있다.

 


 

 

문제와 관련해 어떤 난독화 기법인지 찾아보니 aadecode라는 기법이였다.

 

https://cat-in-136.github.io/2010/12/aadecode-decode-encoded-as-aaencode.html

 

aadecode - Decode encoded-as-aaencode JavaScript program. ['_']

aadecode - Decode encoded-as-aaencode JavaScript program. (゚Д゚) ['_'] Enter ...

cat-in-136.github.io

 

(이 사이트에서 해독할 수 있다.)

 

이제 난독화를 해제해보자!

 

 

...

 

찾아보니 코드가 너무 길어 잘린것이였다(ctrl + u 로 전체 소스코드를 볼 수 있다.)

 

전체 코드를 복사한 뒤 다시 디코딩하면

 

 

 

 

var enco='';
var enco2=126;
var enco3=33;
var ck=document.URL.substr(document.URL.indexOf('='));
for(i=1;i<122;i++){
  enco=enco+String.fromCharCode(i,0);
}
function enco_(x){
  return enco.charCodeAt(x);
}
if(ck=="="+String.fromCharCode(enco_(240))+String.fromCharCode(enco_(220))+String.fromCharCode(enco_(232))+String.fromCharCode(enco_(192))+String.fromCharCode(enco_(226))+String.fromCharCode(enco_(200))+String.fromCharCode(enco_(204))+String.fromCharCode(enco_(222-2))+String.fromCharCode(enco_(198))+"~~~~~~"+String.fromCharCode(enco2)+String.fromCharCode(enco3)){
  location.href="./"+ck.replace("=","")+".php";

 

이제 소스코드를 제대로 알게되었다.

 

문제를 풀어보자!


소스코드 분석

var enco='';
var enco2=126;
var enco3=33;

 

  • enco을 공백문자열로 정의하고 enco2, 3은 각각 126, 33으로 정의
var ck=document.URL.substr(document.URL.indexOf('='));

 

  • url에서 "=" 부분을 찾고 그 이후 문자열을 ck에 저장.

substr(시작, 길이) : "시작" 부터 "길이" 만큼 잘라서 문자열로 리턴.

 

for(i=1;i<122;i++){
  enco=enco+String.fromCharCode(i,0);
}

 

  • enco 에 아스키코드를 문자로 변환한 값 저장(이를 121번 반복).

String.fromCharCode(아스키코드 값) : 아스키코드를 문자열로 변환.

 

function enco_(x){
  return enco.charCodeAt(x);
}

 

  • 문자열을 아스키코드로 변환하는 enco_(x) 함수를 호출.

String.CharCodeAt(문자열) : 문자열을 아스키코드로 변환.

 

if(ck=="="+String.fromCharCode(enco_(240))+String.fromCharCode(enco_(220))+String.fromCharCode(enco_(232))+String.fromCharCode(enco_(192))+String.fromCharCode(enco_(226))+String.fromCharCode(enco_(200))+String.fromCharCode(enco_(204))+String.fromCharCode(enco_(222-2))+String.fromCharCode(enco_(198))+"~~~~~~"+String.fromCharCode(enco2)+String.fromCharCode(enco3)){
  location.href="./"+ck.replace("=","")+".php";

 

  • 만약 ck에 특정 입력값이 있으면 새로운 페이지로 이동

 

우리가 해야할것은 ck를 찾아야한다.

 

수작업으로 찾기엔 시간이 너무 많이 걸리기 때문에 

 

코드를 조금 수정해 자바스크립트를 실행해보았다.

 

https://www.programiz.com/javascript/online-compiler/

 

Online JavaScript Compiler (Editor) - Programiz

Write and run your JavaScript code using our online compiler. Enjoy additional features like code sharing, dark mode, and support for multiple programming languages.

www.programiz.com

(온라인 자바스크립트 컴파일러)

 

 

 

변수 ck를 지우고 밑에 우리가 알아야 할 부분을 출력한 결과

 

=youaregod~~~~~~~! 가 ck임을 알 수 있다.

 

이를 문제 url 뒤에 붙여넣으면 

 

 

문제 해결:)

 

더보기

문제 마지막에

 

분명히 링크에는 = 가 없는데 어디서 = 를 찾아오는지 의문이 들었다.

 

문제를 풀때는 ?뒤에 =~~~ 를 넣으니 풀리긴 했지만..

 

이에 관해 상세히 알아보았다.

 

먼저 쿼리문자열은 웹페이지에 특정 데이터를 보여달라는 사용자의 요청을 말한다.

 

그러니 ? 뒤에 문자는 사용자의 임의의 요청이다(요청하는 데이터가 있으면 페이지를 전달).

 

결국 = 는 내가 입력하거나 특정 페이지로 넘어가는 경우에만 있는것이다.

 

또한 ?=~~~ 에서 키 값이 보이지 않는데

 

이는 키 값 없이 value를 바로 요청하는 방식이다(비표준적 방식)

 

굳이 키 값 없이 value 만으로 데이터 전달이 가능한 경우이므로 키 값을 생략한것이다.

 


 

이번에는 작성하는 방식을 조금 바꿔봤습니다.

 

이렇게 작성하니 좀 힘들긴 하지만 작성하는 저나 보는 여러분들이나 이해가 더 빠를것같네요

 

항상 지적은 환영입니다.

 

+ 날씨가 이제 쌀쌀하네요 다들 감기 조심하세요

 

"계획 없는 목표는 한낱 꿈에 불과하다." - 생텍쥐페리

 

'Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] Challenge 18  (2) 2024.11.08
[Webhacking.kr] Challenge 39  (0) 2024.10.11
[Webhacking.kr] Challenge 26  (0) 2024.10.08
[Webhacking.kr] Challenge 6  (0) 2024.10.06
[Webhacking.kr] Challenge 17  (0) 2024.10.06